سؤال

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


أنا لا يمكن أن يبدو للحصول على كسكودي وقف على الخط مما تسبب في المشكلة ولكن ارى الأسطر التالية في وحدة التحكم التصحيح:

الشمس / 25 15:12:14 jasonsmacbook TestProject[1289] :CGContextSetStrokeColorWithColor:صالح السياق

الشمس / 25 15:12:14 jasonsmacbook TestProject[1289] :CGContextSetLineWidth:صالح السياق

الشمس / 25 15:12:14 jasonsmacbook TestProject[1289] :CGContextAddPath:صالح السياق

الشمس / 25 15:12:14 jasonsmacbook TestProject[1289] :CGContextDrawPath:صالح السياق

2009-10-25 15:12:14.680 LanderTest[1289:207] *** -[CFArray objectAtIndex:]:أرسلت رسالة إلى deallocated سبيل المثال 0x3c4e610

الآن أنا أحاول رسم سياق استرداد من UIGraphicsGetCurrentContext() و تمر إلى الكائن الذي أريد أن ألفت مع.


مزيد من التجربة والخطأ والتصحيح ووجدت أن NSMutableArray لدي عقار في صفي كان في غيبوبة.ذهبت إلى init وظيفة لفئة وهنا رمز كنت تستخدم:

if ((self = [super init])) {
        NSMutableArray *array = [NSMutableArray array];
        self.terrainBlocks = array;
        [array release];
    }
    return self;    
}

أزلت [array release] خط وأنه لم يعد يعطيني EXC_BAD_ACCESS إشارة, ولكن أنا الآن في حيرة من أمري لماذا يعمل هذا.ظننت أنني عندما تستخدم المنشأة تلقائيا الإبقاء عليه بالنسبة لي ، وبالتالي يجب الإفراج عنها من داخل init بحيث لا تسرب.أنا الخلط جيدا حول كيف يعمل هذا و كل الأدلة و ستاكوفيرفلوو الأسئلة قرأت فقط تخلط بين لي أكثر حول كيفية تعيين خصائص داخل بلدي طريقة الحرف الأول.يبدو أن هناك أي توافق في الآراء بشأن الطريقة التي هي أفضل.

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

المحلول

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

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

فإنه يساعد خاصة في المواضيع الأساسية عند المصحح في بعض الأحيان الفضلات على أي معلومات مفيدة.

من المهم جدا أن نلاحظ ومع ذلك ، هو أن تحتاج إلى 100% تأكد من أن هذا هو فقط في رمز التصحيح وليس كود التوزيع.لأنه لا شيء صدر من أي وقت مضى, سوف التطبيق الخاص بك تسرب تسرب تسرب.لتذكير لي أن أفعل هذا, أنا وضعت هذا السجل في appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

إذا كنت بحاجة إلى مساعدة في العثور على نفس الخط ، لا بناء و التصحيح (CMD-Y) بدلا من بناء و تشغيل (CMD-R).عندما تعطل التطبيق ، المصحح سوف تظهر لك بالضبط الذي خط في تركيبة مع NSZombieEnabled, يجب أن تكون قادرة على معرفة بالضبط لماذا.

نصائح أخرى

عن مجموعة الخاصة بك.الخط

NSMutableArray *array = [NSMutableArray array];

لا تعطي في الواقع كنت على الاحتفاظ كائن بل autorelease الكائن.وربما يحصل الاحتفاظ بها في السطر التالي ثم يجب عدم الإفراج عنها في السطر الثالث.انظر هذا

هذه هي القاعدة الأساسية:

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

في كسكودي 4، يمكنك تمكين الكسالى من خلال النقر على القائمة المنسدلة نظام (أعلى اليسار واليمين بجانب زر التوقف) -> برنامج تحرير -> تشخيص تبويب -> تمكين كائنات الزومبي

وكسكودي / جدب يكسر دائما على EXC_BAD_ACCESS، كل ما تحتاجه للعمل في طريقك تصل الدعوة إلى كومة العثور على التعليمات البرمجية التي تشغيله.

لاحظ أن هذه الأنواع من الأخطاء غالبا ما يحدث مع الكائنات autoreleased، وهذا يعني أن السبب الأساسي للمشكلة لن تكون في مكدس الاستدعاءات التي أدت EXC_BAD_ACCESS. وذلك عندما NSZombieEnabled وNSAutoreleaseFreedObjectCheckEnabled تصبح مفيدة.

وإجابة جديدة على موضوع القديم ... في كسكودي 4 أنجع وسيلة لتشخيص استثناءات EXC_BAD_ACCESS هي استخدام الآلات لمحة التطبيق الخاص بك (من كسكودي فوق المنتج / الملف واختيار الكسالى). وهذا سوف يساعد على تحديد الرسائل المرسلة إلى كائنات يتم deallocated.

ومن الطبقات ستانفورد CS193P: إذا قمت بإضافة نقطة توقف (يدويا، عن طريق تحرير نقاط) لsymbolobjc_exception_throw يمكنك الحصول على صورة أفضل بكثير من ما حدث من خطأ - ترك الأمور تسير إلى نقطة حيث يوقف المصحح في حد ذاته يميل إلى أشياء غامضة والمسمار حتى تتبع المكدس. عند وقف في objc_exception_throw يمكنك في كثير من الأحيان ننظر إلى الوراء بالضبط ما تسبب وصول / عملية مشكلتك.

ويتم تعيين نهج مفيدة آخر نقاط من شأنها أن تؤدي مباشرة بعد حدوث الاستثناء:

<اقتباس فقرة>   

وافتح نافذة نقاط التوقف (تشغيل - عرض - نقاط التوقف) وإضافة اثنين من نقاط التوقف رمزية تسمى "objc_exception_throw" و "[رفع NSException]"

ومن: <م > http://blog.emmerinc.be/index.php/2009/03/19/break-on-exception-in-xcode/

وفقط أريد أن أضيف للآخرين الذين يأتون من على شبكة الإنترنت، والبحث عن حلول لنفس الخطأ لكن مع خطأ مختلفة. في حالتي أنا حصلت على نفس الخطأ عندما حاولت مثيل NSDictionary مع مطبعي في اسم المفتاح حيث نسيت أن أضيف "@" أمام مفتاحي:

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: myObj1, @"goodKey", myObj2, "badkey @ is missing in front", nil];

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

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

وقبل تمكين الكسالى أوصي أولا التخلص من كل التحذيرات (إذا كان لديك أي). أشياء بسيطة مثل وظيفة غير باطلة دون سبب returncan هذا الخطأ. إذا لم يكن لديك تحذيرات تسير كما تشير إجابات أخرى.

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