كيف تتجنب NSViewController روابط تسرب الذاكرة؟ [لديك نموذج تطبيق

StackOverflow https://stackoverflow.com/questions/2081138

سؤال

أحاول تنفيذ الإصدار الخاص بي من NSViewController (للتوافق مع الإصدارات السابقة) ، وقد وصلت إلى مشكلة في الارتباطات: نظرًا لأن الروابط تحتفظ بأهدافها ، فإن لدي دائرة الاحتفاظ كلما ربطت من خلال مالك الملف.

لذلك اعتقدت أنني سأقوم فقط بإزالة وجهة نظري بشكل صريح من نظرتها إلى الإشراف وأصدرت الكائنات ذات المستوى الأعلى ، وهذا سيعتني بالروابط ، لأن وحدة التحكم الخاصة بي لم تعد متمسكًا بوجهات النظر ، لذا فقد أطلقوا عليّ وأستطيع أن أتمكن من ذلك يبتعد. ولكن لسبب ما ، لا يزال جهاز التحكم في العرض الخاص بي لا يتم إطلاقه. إليك نموذج تطبيق يعرض المشكلة:

http://dl.dropbox.com/u/34351/bindingsleak.zip

قم بإنشائها ، وقم بتشغيلها ، وضغط على CMD-K ("إنشاء NIB" في قائمة "EDIT") لتحميل NIB في النافذة الفارغة. اضغط على CMD-K مرة أخرى لإصدار وحدة تحكم العرض الأولى (TestNibowner) وتحميل واحدة جديدة. وحدة التحكم القديمة في العرض لا تحصل على Dealloced ، على الرغم من.

قم بإزالة الربط "القيمة" على خانة الاختيار ، ويتم إصداره على ما يرام.

إذا قمت بتعيين نقاط التوقف على تجاوزات الإصدار/الاحتفاظ/autorelease ، فسترى أن _nsbindingInfo يحتفظ بـ testnibowner ، ولكنه لا يطلقه أبدًا في حالة التسرب.

أي شخص يعرف كيفية إصلاح هذا؟

هل كانت مفيدة؟

المحلول

شيء واحد قمت به لنفس المشكلة هو إنشاء وكيل NSOBjectController داخل NIB الخاص بي. تحتوي فئتي التي تشبه NSViewController على مؤشر لهذا الوكيل وجميع الروابط مرتبطة به. عندما أرغب في تنظيف وحدة التحكم في العرض ، أقوم بعد ذلك [setcontent SelfProxy: NIL] على وحدة تحكم الكائن وإطلاق وحدة تحكم العرض. في هذه الحالة ، يعمل وكيل NSOBjectController باعتباره غير التلقائي في هذه الحالة.

إنه أكثر يدويًا ولا يمكنك إطلاق الرأي بمفرده ، لكنه يحل مشكلة الاحتفاظ.

أقترح عليك القيام بذلك:

-(void) releaseTopLevelObjects
{
    // Unbind the object controller's content by setting it to nil.
    [selfProxy setContent:nil];

    NSLog( @"topLevelObjects = %@", topLevelObjects );
    [topLevelObjects release];
    topLevelObjects = nil;
}

في NIB الخاص بك ، ستحدث الروابط من خلال مسار مثل:

selfProxy.content.representedObject.fooValue

نصائح أخرى

في إجراء القليل من التحقيقات مع Class Dump و Friends ، يبدو أن Apple لديها فصل خاص يسمى NSAUTOUNBINDER الذي يعتني بهذا العمل القذر لفصول NSVIEWCONTROLLER و NSWINDOWCONTROLLER. لا يمكن حقًا معرفة كيفية عمله أو كيفية تكراره.

لذلك ، لا يمكنني الإجابة على سؤالك حقًا حول كيفية منع دورة الاحتفاظ بالارتباطات التعسفية في NIB المحملة ، ولكن ربما يكون من العزاء أن تعرف أن Apple تغش ، وأنك لا تفتقد أي شيء واضح. :-)

عندما تقوم بإزالة وجهة نظرك من رأيها المشرف ، هل ترسلها أيضًا رسالة أخرى؟ تم إنشاؤه عن طريق unarchiving من النقش ، أليس كذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top