أي طريقة للتحقق مما إذا كان مثيل لا يزال في الذاكرة؟
-
22-09-2019 - |
سؤال
مثال: لدي وحدة تحكم عرض والتخلص منه. ولكن لا يزال هناك متغير يحمل عنوان ذاكرة. الوصول إلى ذلك يؤدي إلى exec_bad_access. بالتاكيد. ولكن: هل هناك أي طريقة للتحقق مما إذا كان هذا المتغير لا يزال صالحًا؟ أي إذا كان لا يزال يشير إلى شيء موجود في الذاكرة؟
المحلول
تحتاج إلى قراءة هذا مرة أخرى:
باختصار ، إذا كنت تريد أن تلتصق بشيء من حولك يجب retain
هو - هي.
إذا كنت تريد أن يختفي شيء وقد احتفظت به من قبل, ، يجب عليك أن release
أو autorelease
هو - هي.
أنت يجب أبدا يتصل dealloc
مباشرة (باستثناء [super dealloc];
في نهاية كل واحد من dealloc
أساليب).
أنت يجب أبدا release
أو autorelease
كائن لم تفعل retain
.
لاحظ أن بعض الطرق فعل إرجاع الأشياء المحتجزة التي يجب عليك release
. اذا أنت alloc
مثال على الفصل ، وهذا يعني retain
. اذا أنت copy
والمثال ، يتم الاحتفاظ بالنسخ.
إذا كنت قد أميل إلى استخدام retainCount
الطريقة ، لا. انها ليست مفيدة. فقط النظر في الاحتفاظ بالتعداد كدلتا. إذا أضفت ، يجب أن تطرح ، ولكن القيمة المطلقة هي تفاصيل التنفيذ التي يجب تجاهلها.
(وبعبارة أخرى ، حتى لو كانت هناك طرق للتحقق من صحة الكائن بشكل نهائي - ليس هناك - سيكون هذا هو الإجابة الخاطئة.)
أوه ، واستخدم بناء وتحليل ميزة في Xcode. إنها مهمة جيدة للغاية - ولكنها ليست مثالية تمامًا - لتحديد مشاكل إدارة الذاكرة ، من بين أشياء أخرى.
نصائح أخرى
هذا ما تم إعداد نموذج إدارة الذاكرة بأكمله - إذا اتصلت retain
في الأوقات المناسبة ، و release
و autorelease
في الأوقات المناسبة ، لا يمكن أن يحدث. يمكنك استخدام NSZombie
لمساعدتك في تصحيح.
استخدم "nszombieEnabled" نقطة الاستراحة.
لهذا السبب ، يوصينا جميعًا بشدة باستخدام Accessors. إذا تم إصدار كائنك في أي مكان ، فسيتم تعيينه إلى NIL ، ولن يكون هناك أي ضرر إذا اتصلت بأي API أو طريقة على كائن NIL. لذا يرجى العادة لاستخدام الملحقات.
يمكنك فقط إضافة علامة nszombieenabled كوسيطة لتطبيقك في إعدادات الإنشاء. وتمكينه. الآن يمكنك تشغيل التطبيق الخاص بك في وضع التصحيح. إذا كان هناك أي حادث من هذا القبيل على وشك الحدوث ، فستظهر لك نقطة التوقف هذه الكائن الذي يتم تحريره وأين يتعطل.
هتاف ، مانجوناث
إذا كان ذلك بالمتغير ، فإنك تعني ما إذا كان المؤشر إلى كائنك لا يزال يشير إلى ذاكرة صالحة ثم:
myClass *myVariable = [[myClass init] init] ؛
// طن من الأشياء يحدث ...
إذا (myVariable! = لا شيء) // افعل المزيد من الأشياء