سؤال

عندما أضع NSZombieEnabled = Yes لا شيء مكتوب إلى وحدة التحكم. كيف يمكنني اصلاح هذا؟ أو هل تستطيع أن تنصحني بأي أدوات أخرى ل EXC_BAD_ACCESS?

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

المحلول

لديك تحطم قديم عادي. exc_bad_access يعني أن طلبك قد حاول الوصول إلى عنوان ذاكرة غير صالح. في حين أن السبب الأكثر نموذجية لهذا التطبيق في تطبيق موضوعي غير GC'd-C هو المراسلة كائن بعد الكتب، فإن شيئا يكتشف وضع Zombie، يمكن أن يحدث هذا التعطل بالذات أي عدد من الطرق الأخرى (كما يتضح).

نظرا لأن التطبيق الخاص بك يتعطل، يجب أن يكون لديك Backtrace. تحتاج إلى نشر تلك التراس هنا لأي منا أن نكون قادرين على مساعدتك.

كما قال براد، قم بتشغيل التطبيق الخاص بك مع تمكين تصحيح الأخطاء. في Xcode، ستجد عنصر القائمة "تشغيل / تصحيح" ضمن قائمة "التشغيل". استخدام هذا واحد. عندما تعطل طلبك، يجب أن تشاهد تتبع مكدس في الركن الأيسر العلوي من نافذة المصحح.

لا، حقا، أنهم يظهرون في المصحح. الصورة تساوي 1000 كلمة.alt text
(مصدر: الجمعة.كوم)

نصائح أخرى

"exc_bad_access" لا يرتبط بالضرورة بمثيل غيبوبة. يمكن ربط الوصول إلى مرجع غير محدد، مثل متغير محلي.

NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error

يحرر:لن يساعدك Nszombie Flag فقط في حل النتيجة "exc_bad_access" عن استخدام مثيل لإزالة التوصيل.

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

تأكد أيضا من تهيئة جميع المؤشرات إلى NIL قبل استخدامها!

إذا كنت تستخدم مؤشرا دون تهيئة ذلك إلى NIL أو أي كائن آخر، فسوف ينتهي الأمر بالوصول إلى الذاكرة التي لا تكون لك.

على سبيل المثال، سيعطي التعليمات البرمجية التالية أيضا exc_bad_access غير قابل للتتبع باستخدام علم NSZombieEnnabled الناجم عن السطر الأخير.

RecordingLocation* closest;

//find the closest recording location
for (...)
{
    //try to find the closest object...
    //suppose we don't find anything so closest is never set.
}

if (closest!=nil)
    NSLog(@"Closest: %f,%f",closest.x,closest.y);

لا أفهم كيف يجيب الإجابة على هذا السؤال على السؤال ..

أنا أسأل نفسي نفس الشيء. باستخدام Xcode4 لقد قمت بتمكين nszobmieenabled = نعم لوقف عند الوصول إلى كائن تم إصداره، بدلا من التعطل مع exc_bad_access - وهو أمر مفيد للغاية.

كان السؤال في متناول اليد:

"عندما قمت بتعيين NSZombieEnabled = نعم لا يوجد شيء مكتوب إلى وحدة التحكم. كيف يمكنني إصلاح هذا ...".

بسيطة ومباشرة إلى الأمام.

أواجه نفس المشكلة. توقف XCode مع مصحح الأخطاء ولكن وحدة التحكم لا تنتج أي رسالة. أتوقع شيئا على غرار:

"الرسالة المرسلة إلى المثيل المعامل ...".

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

هل حاولت بدء تشغيل التطبيق في المصحح (تشغيل | تصحيح - نقاط التوقف)؟ بمجرد أن تضغط على exc_bad_access، يجب أن توقف المصحح. إذا نظرت إلى Backtrace المعروضة في المصحح (Run | Debugger)، فقد تظهر لك المكان الذي حدث فيه الخطأ.

عندما أنفقت فقط 20 دقيقة سعيدة يحدق في هذا مع NSZombieEnabled لا يعمل، اعتقدت أنني سأضيف هذا سيؤدي إلى exc_bad_access

NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];

لاحظ المفقودين '@' في الملمع الثاني. لم أفعل :-)

كان لدي تجربة مختلفة مع exc_bad_access، لذلك أود أن أشاركها.

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

في النهاية، لاحظت أنني كنت أحصل على خطأ exc_bad_Access والسلوك الغريب لأنني إعادة تسمية زوج من ملفات XIB قبل يوم من قبل. لقد حددت كائن "عرض وحدة تحكم" لملف Mainwindow.xib وتصحيح اسم NIB. خاصية. ثم، كل شيء يعمل بسلاسة.

لا أعتقد أن كل exc_bad_access موجود بواسطة Nszombie موات ..
لأن بعض الحالات أنا أيضا لا أحصل عليها أثناء استخدام غيبوبة ..
أعتقد أن exc_bad_access المرتبطة باستخدام الكائن الذي تم إصداره يمكن أن ينظر عن طريق تمكين غيبوبة.

ومشكلة أخرى لاحظت أثناء استخدام Zombie هي: في بعض الأحيان تسبب أيضا تعطل في التصحيح. حالة واحدة اشتعلت تحطمت، تظهر:
*** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
يحدث ذلك فقط عند تمكين NSZombie.

ما أقوم به هو،
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
أقوم بتصدير كائن "MagazineWebView" الحالي وتحميل [عنوان URL للطلب] في كائن آخر "MagazineWebView" كائن آخر. لتحقيق بعض وظائفي ...

شكرا

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