سؤال

أنا أبحث في بعض التعليمات البرمجية مفتوحة المصدر و نحاول أن نفهم لماذا الكاتب لم يفعل شيئا بطريقة معينة.

الفئة هو التفاف حول 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 سوف لا تزال تشير إلى صالح الكائن.

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