سؤال

مثال: لدي وحدة تحكم عرض والتخلص منه. ولكن لا يزال هناك متغير يحمل عنوان ذاكرة. الوصول إلى ذلك يؤدي إلى 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! = لا شيء) // افعل المزيد من الأشياء

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