في الكاكاو هل أنا بحاجة إلى إزالة كائن من تلقي المنظمة الإخطارات عندما deallocating ؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

عندما كنت قد سجلت كائن فو تتلقى المنظمة الإخطارات من كائن آخر شريط (باستخدام addObserver:...), إذا كنت ثم تخصيص فو هل أنا في حاجة الى ارسال removeObserver:forKeyPath: رسالة إلى شريط في dealloc?

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

المحلول

تحتاج إلى استخدام -removeObserver:forKeyPath: لإزالة المراقب قبل -[NSObject dealloc] يعمل لذا يفعلون ذلك في -dealloc طريقة صفك العمل.

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

هذا هو المهم أن نأخذ في الاعتبار لأن عمر الكائنات في الكاكاو ليست حتمية كما يبدو أن بعض الناس يعتقدون أنه هو.مختلف Mac OS X الأطر أنفسهم سوف إرسال الكائنات -retain و -autorelease, تمديد حياتهم أبعد ما قد خلاف ذلك أعتقد أنه سيكون.

علاوة على ذلك, عند الانتقال إلى الهدف-C جمع القمامة ، ستجد أن -finalize سيتم تشغيل في أوقات مختلفة جدا — و في سياقات مختلفة جدا — من -dealloc هل.لشيء واحد, الصيغة النهائية تجري على موضوع مختلف ، لذلك كنت حقا لا يمكن إرسال بأمان -removeObserver:forKeyPath: إلى كائن آخر في -finalize الأسلوب.

عصا الذاكرة (وغيرها من الموارد النادرة) في إدارة -dealloc و -finalize, واستخدام منفصل -invalidate الأسلوب أن يكون مالكا أقول كائن الانتهاء من ذلك معها في القطعية نقطة ؛ تفعل أشياء مثل إزالة المنظمة الملاحظات هناك.القصد من التعليمات البرمجية الخاصة بك سوف تكون أكثر وضوحا و سيكون لديك أقل البق خفية إلى رعاية.

نصائح أخرى

قليلا من معلومات إضافية أن كنت قد اكتسبت من خلال تجربة مؤلمة:على الرغم من أن NSNotificationCenter يستخدم التصفير إشارات ضعيفة عند تشغيل تحت جمع القمامة ، فإنها لا.وهكذا يمكنك الحصول على بعيدا مع عدم إزالة NSNotificationCenter المراقب عند استخدام GC (عند استخدام الإبقاء/الإفراج عنهم ، كنت لا تزال بحاجة إلى إزالة مراقب) ، ولكن لا يزال يجب إزالة المنظمة المراقبين ، كريس يصف.

بالتأكيد أتفق مع كريس على "عصا الذاكرة (وغيرها من الموارد النادرة) الإدارة في dealloc و وضع اللمسات الأخيرة..." تعليق.في الكثير من الأحيان سوف ترى الناس في محاولة لإبطال NSTimer الكائنات في dealloc وظائف.المشكلة هي NSTimer يحتفظ انها الأهداف.لذلك ، إذا كان الهدف من ذلك NSTimer هو الذات ، dealloc لن تحصل تسمى مما أدى في بعض يحتمل أن تكون سيئة تسرب الذاكرة.

يبطل في -invalidate و تنظيف الذاكرة في dealloc و finalize.

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