سؤال

والخروج في نهاية تطوير تطبيق اي فون وأنا أتساءل فقط عن مدى سوء هو استخدام autorelease عند وضع لفون. أنا واجهت مع بعض أعطال عشوائي إلى حد ما، وحتى الآن، لا أستطيع تحديد ذلك إلى أي شيء آخر من استخدام الذاكرة قذرة.

وكما مبتدئ الكاكاو أذكر أني قرأت في البداية وثيقة مبادئ توجيهية أن اقترح بقوة تفادي autorelease لصالح دليل تحتفظ / الافراج عن اي فون. ومع ذلك، جاء المزيد من "كبار" المطور الكاكاو على متن الطائرة في وقت مبكر (الذي كان من المفارقات ترك ذهب منذ ذلك الحين)، الذي كان autorelease في كل مكان. وباعتراف الجميع، وأنا ذهبت إلى "قرد رؤية قرد تفعل" واسطة، ويبدو أن يعود ليسكن لي (أنا الآن المطور الوحيد للمشروع).

وهكذا ما يجب القيام به بعد ذلك؟ ويبدو لي أن لدي لفرع رمز ومحاولة للذهاب من خلال والاستبدال، وحيثما كان ذلك ممكنا، autorelease كود حفظ أصابعي عبرت أنني لا كسر عن غير قصد التطبيق. يبدو الكثير من المكالمات مكتبة يؤدي في كائنات autoreleased مثل stringWithFormat والى حد كبير أي شيء حيث أنا لا تستخدم الوك نفسي. أي gotchyas و / أو اقتراحات أخرى أرجو أن تبحث عنها؟ بفضل الكاكاو المعلمون.

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

المحلول

وعن طريق إطلاق بدلا من autorelease يمكن تحسين استخدام الذاكرة في المواقف الصعبة (وهو أمر جيد على اي فون)، لكنه لن يساعد على الإطلاق مع تحطمها إذا كنت لا تتبع القواعد تحتفظ / الإصدار. وأود أن قراءة بعض الدروس على إدارة الذاكرة في الكائنات C إذا كنت لا يزال قليلا ضبابية حول ما يجب أن تقوم به، ثم انتقل بعد تلك الحوادث باستخدام التقارير المصحح وتحطم لمعرفة أين كنت خلال إطلاق الأجسام . هذا و <لأ href = "http://www.cocoadev.com/index .PL؟ RulesOfThumb "يختلط =" نوفولو noreferrer "> هذا هما أماكن جيدة للبدء.

نصائح أخرى

والأهم من autorelease أو دليل الافراج عن خيار هو عدد المرات التي alloc وdealloc NSAutoreleasePools الخاص بك. منذ أكثر من أطر الكاكاو استخدام autorelease تحرري، تحتاج إلى أن يكون استراتيجية تجمع استنزاف المناسبة. بمجرد أن يتم في مكان، واختيار ما إذا كان لrelease أو autorelease يصبح أقل بكثير قضية.

وأن يقال، والمناطق الوحيدة التي يجب أن تقلق هي حلقات ضيقة - تخصيص واطلاق سراح NSAutoreleasePool كل بضع تكرار حصول على أفضل النتائج. وعندما يكون لديك ولدت NSThread آخر لا يملك Runloop - إنشاء تجمع واستنزاف أنه بين الحين والآخر يصبح خاملا. وبما أن معظم التطبيقات فقط تخصيص كمية صغيرة من البيانات في الحدث، واستراتيجية UIKit للتخصيص تجمع قبل أن يتم استدعاؤها الحدث وإطلاقه بعد عودة ارسال يعمل بشكل جيد للغاية.

إذا كنت تعتقد أنك دونو كيفية استخدام autorelease، تحقق من CS193p FALL 2010 على اي تيونز U -> محاضرة رقم 4.

ووهل يعلم كل شيء عن إدارة الذاكرة والاشياء (إذا كنت تخطي أول 10 دقيقة أو نحو ذلك)

لأسباب تتعلق بالأداء فون، أبل تشير إلى أنه كلما كان ذلك ممكنا، يجب عدم استخدام الأشياء autoreleased. بدلا من ذلك، وإطلاق سراح صراحة الأشياء الخاصة بك عند الانتهاء معهم.

وعن طريق حمامات autorelease يعني أنك قد ترك بعض الذاكرة غير المستخدمة حول الكذب. منذ فون ديه ذاكرة أقل للذهاب حولها، وكنت قد تحسين الأداء إذا كنت تحرير الذاكرة غير الضرورية في أسرع وقت ممكن، بدلا من السماح لها الجلوس حول تناول الموارد بينما ينتظر لautorelease.

عند autorelease، كنت تقول في الأساس: "أنا لست بحاجة إلى هذا لفترة أطول، ولكن أي شخص آخر حر في يستلم (قبل ينضب تجمع الافراج عن السيارات)". عند ريلاسي صراحة كائن تقوله: "أنا لست بحاجة إلى هذا لفترة أطول وإلا أي شخص آخر قد سبق وقال خلاف ذلك (المكتسبة)، فإنه يجب أن يمكن deallocated فورا"

وبناء على ذلك، autorelease ليس عادة خاطئ شيء. هو مطلوب منها عندما تريد تمرير الكائنات إلى مرسل الرسالة دون الحاجة إلى المرسل لرعاية الافراج عن الكائن.

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