هل يمكن لشخص ما أن يعطيني يدك حول هذا التطبيق في تطبيق iPhone؟

StackOverflow https://stackoverflow.com/questions/1248810

سؤال

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x30011940 in objc_msgSend ()
#1  0x30235f24 in CFRelease ()
#2  0x308f497c in -[UIImage dealloc] ()
#3  0x30236b78 in -[NSObject release] ()
#4  0x30a002a0 in FlushNamedImage ()
#5  0x30250a26 in CFDictionaryApplyFunction ()
#6  0x30a001a4 in _UISharedImageFlushAll ()
#7  0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8  0x3054dc80 in _nsnote_callback ()
#9  0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in -[UIApplication _receivedMemoryNotification] ()
#14 0x30a005d8 in _memoryStatusChanged ()
#15 0x30217416 in __CFNotificationCenterDarwinCallBack ()
#16 0x3020d0b0 in __CFMachPortPerform ()
#17 0x30254a76 in CFRunLoopRunSpecific ()
#18 0x3025416a in CFRunLoopRunInMode ()
#19 0x320452a4 in GSEventRunModal ()
#20 0x308f037c in -[UIApplication _run] ()
#21 0x308eea94 in UIApplicationMain ()
#22 0x00002096 in main (argc=1, argv=0x2ffff514)

حاليا لدي خطأ غريب للغاية في برنامجي. في بعض الأحيان يحدث ذلك، وأحيانا، لا. ولكن إليك ملخص لما يحدث:

عندما يبدأ البرنامج:

  • البيانات المحفوظة (مجرد شاشة قصيرة تتكون من 13 عنصرا) تم تحميلها إذا كان موجودا.
  • يتم تحميل المعطر الضخم الذي يحتوي على 1014 سلاسل في NSMutabilabledriary.
  • يتم تحميل عرض آخر يحتوي على 78 سلاسل في NSArray.
  • تم لعب فيلم .mp4.

يحدث الخطأ في جزء من حيث تتم إزالة عرض OpenGL ES والمستخدم على وشك عرض إحدى سلاسل سلاسل 1014 في NSMutabledictionary.

لا يحدث هذا الخطأ أبدا في المحاكاة. يحدث فقط على iPhone، وأحيانا يدير بشكل جيد ولكن في بعض الأحيان يسحق.

ومع ذلك، بعد قراءة StackTrace، أرى CFDictionaryApplyFunction في هناك، لذلك اعتقدت أنه قد يكون أحد الأسباب المحتملة. هل ذلك لأنه على جهاز محاكاة، يقرأ الأمور بسرعة كبيرة يتم تحميل القاموس بأكمله من المعطر في لحظة، بينما على الجهاز، يقرأ أبطأ؟ بصراحة، أنا لا أعرف بالضبط كيف يعمل القاموس. هل قرأت جميع سلاسل 1014 في لحظة، أو أنها تستخدم بعض المواضيع الأخرى لقراءة ببطء؟ من فضلك النصيحة. شكرا لك.

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

المحلول

عندما تحصل على EXC_BAD_ACCESS, ، غالبا ما يعني أنك تحاول استدعاء طريقة على كائن غير موجود - ربما لأنه تم إلغاؤه.

حوالي منتصف الطريق أسفل التتبع، هناك بعض تحذير الذاكرة المكالمات، مثل:

#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()

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

أقرب إلى الإطار # 0، يبدو أنه يحاول مسح ذاكرة التخزين المؤقت ل UIImage الكائن، وهذا يبدو أن الوصول السيئ.

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

@interface MyClass {
  UIImage* myImage;
}
// ...
- (id) init {  /* the usual stuff */
  myImage = [UIImage imageNamed:@"bob_the.png"];
  return self;
}

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

دون رؤية الكود، ليس لدي أي طريقة لمعرفة ما إذا كان هذا ما يحدث بالفعل، لكنه نوع واحد من الخطأ يسهل القيام به.

تعطي هذه الأسئلة ذات الصلة نصائح حول حوادث مماثلة: EXC_BAD_ACCESS تصحيح السؤال رقم 1 و السؤال 2.

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

نصائح أخرى

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

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