متى autorelease يسبب في الواقع الافراج عنه في الكاكاو اللمس؟
-
21-08-2019 - |
سؤال
وأنا أفهم عليك أن تكون حذرا مع autorelease
على دائرة الرقابة الداخلية. لدي طريقة التي يتم إرجاع كائن ذلك alloc
s التي يحتاجها الطالب، وذلك في هذه الحالة - كما أفهمها - أنا في حاجة الى ارسال autorelease
إلى الكائن في المستدعي قبل أن يعود
وهذا على ما يرام، ولكن بمجرد يعود التحكم إلى الهاتف (أي بعد أن تم تجهيزها بلدي انقر على زر) يبدو أن يتم تحرير تجمع autorelease. وأظن أن هذا هو كيف أنه من المفترض أن يكون، ولكن أنا أتساءل ما هو أفضل الممارسات لهذا الوضع.
ولقد لجأت إلى إرسال رسالة retain
من المتصل بحيث لا يتم تحرير الكائن ومن ثم صراحة إطلاقه في dealloc
.
هل هذا هو النهج الأفضل؟
المحلول
ويتم تحرير تجمع autorelease عادة بعد كل تكرار للحلقة التشغيل. تقريبا، ويتمحور كل تطبيق الكاكاو والكاكاو اللمس مثل هذا:
Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool
ما تصفون هو السلوك المتوقع. إذا كنت تريد أن تبقي كائن حول أي أطول من ذلك، سوف تحتاج إلى الاحتفاظ بها صراحة.
نصائح أخرى
وعن طريق autorelease
هو طريقة للقول، "كائن، وأنا لا أريد منك بعد الآن، ولكن انا ذاهب لتمرير لك شخص آخر الذي قد ترغب أنت، لذلك لا تختفي تماما بعد". ذلك الكائن ستلتزم جميع أنحاء طويلة بما فيه الكفاية بالنسبة لك للعودة من طريقة أو إعطائها إلى كائن آخر. عندما يريد بعض رمز للحفاظ على وجوه حولها، ويجب أن يدعي ملكية retain
ing ذلك.
المبادئ التوجيهية لإدارة الذاكرة للحصول على كل ما تحتاجه ل تعرف إلى استخدام autorelease
بشكل صحيح.
وهنا هو examle المنصوص عليها في الوثيقة أبل إدارة الذاكرة و>:
– (id)findMatchingObject:(id)anObject
{
id match = nil;
while (match == nil) {
NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
/* Do a search that creates a lot of temporary objects. */
match = [self expensiveSearchForObject:anObject];
if (match != nil) {
[match retain]; /* Keep match around. */
}
[subPool release];
}
return [match autorelease]; /* Let match go and return it. */
}
نعم، هذا هو أفضل نهج. حقا هو المقصود Autorelease فقط للتفاعل في التعليمات البرمجية التي تعرفها. بمجرد الانتهاء من تخزين كائن، يجب عليك إما نعلم أن الكائن الذي يحمل إشارة لن يموت / الخروج من نطاق حتى كنت أيضا القيام به مع الكائن، أو كنت بحاجة للاحتفاظ الكائن.
ومكفول فقط أن يتم الإفراج عن الأجسام autoreleased بعد نهاية الأسلوب الخاص بك. بعد كل شيء، والطريقة التي تسمى طريقة الخاص بك قد يكون السبب في حمام السباحة الخاص بها والإفراج عنها مباشرة بعد الأسلوب الخاص بك.