ما هي النقطة في الإبقاء على الفور تليها autorelease?
-
30-09-2019 - |
سؤال
أنا أبحث في بعض التعليمات البرمجية مفتوحة المصدر و نحاول أن نفهم لماذا الكاتب لم يفعل شيئا بطريقة معينة.
الفئة هو التفاف حول NSArray
لإنشاء هيكل البيانات المكدس مع دفع, البوب الخ.
أسلوب واحد هو topObject
والتي ترجع أعلى الكائن على كومة وتنفيذها:
- (id)top {
return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}
ما مع الاحتفاظ تليها فوري autorelease?
كان رد فعلي الأولي أن هذا من شأنه أن يمنع محلل التحذير من تسرب الذاكرة ، ولكن أنا حللت دون احتفاظ/autorelease وكان لا يزال هناك أي تحذير.
تبحث في دورة حياة كائن سيكون إنشاء دفع إلى المكدس صدر ، حتى المكدس يملك كائن (الأساسية مجموعة الاحتفاظ بها عند إضافة).
لذلك أنا لا أفهم استخدام الإبقاء/autorelease هنا...
المحلول
دعونا نفترض top
سوف تبدو مثل هذا:
- (id) top {
return [stack lastObject];
}
ثم تخيل هذا:
foo = [bar top];
[bar removeAllObjects];
// Do something with foo
التالية قد يحدث:السطر الثاني من شأنه أن يجعل الاحتفاظ العد قطره 0 ، من السطر الثالث foo
من شأنه أن يشير إلى deallocated الذاكرة.ولكن مع retain
و autorelease
الاحتفاظ العد من 1 حتى تجمع أفرغ مما في السطر الثالث foo
سوف لا تزال تشير إلى صالح الكائن.