سؤال

أقوم بإنشاء تطبيق iPhone حيث أقوم بفصل بعض الخيوط للقيام بعمل طويل الأمد في الخلفية حتى لا يتم تعليق واجهة المستخدم.أدرك أن سلاسل الرسائل تحتاج إلى مثيلات NSAutoreleasePool لإدارة الذاكرة.ما لست متأكدًا منه هو ما إذا كانت الطريقة المترابطة تستدعي طريقة أخرى - هل تحتاج هذه الطريقة أيضًا إلى NSAutoreleasePool؟

رمز المثال:

- (void)primaryMethod {
    [self performSelectorInBackground:@selector(threadedMethod) withObject:nil];
}

- (void)threadedMethod {
    NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc] init];

    // Some code here

    [self anotherMethod];

    // Maybe more code here

    [aPool drain];
}

- (void)anotherMethod {
    // More code here
}

سبب سؤالي هو أنني أتلقى أخطاء تفيد بأنه تم إصدار الكائنات تلقائيًا مع عدم وجود تجمع في مكانها، وأنها "تتسرب فقط".

لقد رأيت أسئلة أخرى لم يكن لدى الأشخاص فيها تجمعات للإصدار التلقائي على الإطلاق، وأتفهم سبب الحاجة إلى تجمعات للإصدار التلقائي.أنا مهتم على وجه التحديد بمعرفة ما إذا كان تم إنشاء مجموعة الإصدار التلقائي في (في هذا المثال) threadedMethod ينطبق على الكائنات التي تم إنشاؤها في anotherMethod.

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

المحلول

لإجابة على سؤالك، نعم، anotherMethod يستخدم NSAutoreleasePool قمت بإنشائه في threadedMethod، وأي شيء autorelease سيكون هناك صدر عندما يتم تحريرها aPool / ينضب.

وهكذا فإنه من غير المحتمل أن الخطأ الخاص بك نابعة مباشرة من هذا الرمز (ما لم يكن هناك أكثر يحدث).

ووضع نقطة فاصل على _NSAutoreleaseNoPool (إضافته بالاسم في نافذة نقاط التوقف) وتشغيل التعليمات البرمجية في المصحح، وسوف تتوقف عندما يتم استدعاء autorelease دون بركة، وأنه ينبغي حل مشكلتك.

نصائح أخرى

في المثال الخاص بك، نعم، يتم تنفيذ NSAutoreleasePool عبر الأساليب منذ استدعاء [self anotherMethod] متداخلة في الداخل -(void)threadedMethod.

  • س:NSAutoreleasePool يحمل عبر الأساليب؟
  • أ:هذا يعتمد:
    1. عبر الدعوات المتداخلة، نعم.
    2. عبر دعوات الأخوة، لا.

ومهما كان الأمر، فإن NSAutoreleasePool المثال نفسه يخرج عن النطاق عندما يختفي النطاق الأصلي. -في المثال الخاص بك، في نهاية -(void)threadedMethod { }.

المقال المذكور سابقا (http://thegothicparty.com/dev/macos/nsautoreleasepool/) واضح تمامًا بشأن ذلك.

وتجمع autorelease لا تحمل حتى anotherMethod. ومع ذلك، عندما تنتهي الدالة مترابطة، يجب عليك الاتصال [الإفراج aPool] بدلا من [استنزاف aPool]. وهي تقريبا تعادل، ولكن إطلاق aPool يسبب NSAutoreleasePool للافراج عن نفسها بالإضافة إلى كل الكائنات الأخرى في حوض السباحة. عندما تنتهي الدالة الخيوط بعد استدعاء هجرة، تجمع autorelease لا يزال لديه احتفاظ عدد من +1! الاحتمالات هي، الكائن "تسريب فقط" هو aPool!

وتحرير:

وجيم النبض هو الصحيح حول هذا الإصدار واستنزاف يجري ما يعادلها. وتقول مستندات أبل بوضوح أنها متطابقة في بيئة غير القمامة التي تم جمعها، واستنزاف أفضل في حالة تجميع البيانات المهملة. خطأي لعدم قراءة مستندات!

وهنا مقال الذي يقدم لمحة عامة عن NSAutoreleasePools - يجب أن تساعد نقطة لكم في الاتجاه الصحيح. لأنه ليس هناك كومة الظاهري حمامات autorelease، والعلوي واحدة وسوف تستخدم في كل مكان داخل التطبيق - بغض النظر عن مكان يتم autoreleased الأجسام

http://thegothicparty.com/dev/macos/nsautoreleasepool/

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