سؤال

لقد قرأت الكثير عن هذه المسألة ولكن لا يزال يبدو مختلفًا بطريقة أو بأخرى. لذلك من ما فهمته ، يحدث exc_bad_access مع مشاكل إدارة الذاكرة.

الشيء هو ، لي لا يبدو (! :)) ليكون هناك. الشيء ، لقد أضفت زرًا بسيطًا في IB ، مستقيم مستدير ، بدون صورة. أنا مدمن مخدرات مع ibacte التي حددتها في صفي. هذه الطريقة لا تفعل شيئًا (!) بالمناسبة.

على أي حال ، بمجرد النقر فوق الزر ، يتعطل التطبيق ، مع "exc_bad_access".

أنا بالتأكيد لا أفرط في أي شيء ، بقدر ما أستطيع أن أرى ، وهذا هو. ما هو الخطأ هناك؟

أي أدلة؟

هذا هو سجل وحدة التحكم الخاص بي:

Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-148-79
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 11779]
[Switching to thread 11779]
(gdb) continue
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

هذا ما أحصل عليه ، بعد أن صعدت إلى المكدس:

#0  0x31ec3ebc in objc_msgSend ()
#1  0x33605784 in -[UIApplication sendAction:to:from:forEvent:] ()
#2  0x336056ec in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#3  0x336056b4 in -[UIControl sendAction:to:forEvent:] ()
#4  0x3360530c in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#5  0x33605f8c in -[UIControl touchesEnded:withEvent:] ()
#6  0x335fd9ac in _UIGestureRecognizerUpdateObserver ()
#7  0x30da1830 in __CFRunLoopDoObservers ()
#8  0x30de9346 in CFRunLoopRunSpecific ()
#9  0x30de8c1e in CFRunLoopRunInMode ()
#10 0x332e7374 in GSEventRunModal ()
#11 0x335adc30 in -[UIApplication _run] ()
#12 0x335ac230 in UIApplicationMain ()
#13 0x000027a8 in main (argc=1, argv=0x2ffff4d8) at /Users/SomePath/main.m:14
هل كانت مفيدة؟

المحلول

تعرضت للتعذيب من هذا لبضع ساعات أيضًا. اتضح أن مشكلة الذاكرة كما هو متوقع. تم تمييز وحدة التحكم التي تعمل كهدف للزر. كانت وحدة تحكم الجذر لوحدة تحكم التنقل التي تمت إضافتها مباشرة إلى النافذة. بدا رمزتي هكذا:

MyController *myController = [[MyController new] autorelease];
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];

كان افتراضي ذلك myController سيتم الاحتفاظ بها عندما يتم تمريرها كوحدة تحكم الجذر لـ UINavigationController, ، ولكن اتضح أنه خطأ. كان الحل هو تعيين وحدة التحكم إلى متغير محلي وإطلاقه فيه dealloc. يجب أن تحتوي واجهة الكائن الذي يحتوي على الكود أعلاه:

...
@property (retain, nonatomic) MyController *myController;
...

والتنفيذ:

self.myController = [[MyController new] autorelease];
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];

...

- (void)dealloc {
    [self.myController release];
    ...
    [super dealloc];
}

نصائح أخرى

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

إذا بدأت وحدة التحكم مثل هذا:

MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

ستكون على ما يرام إذا كنت لا تستخدم ARC ، لأنه لن يتم تخصيص المرجع حتى يتم إصداره يدويًا. لذلك واجهت هذه المشكلة عند ترقية المشاريع لاستخدام ARC.

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

تتمثل طريقة حل ذلك في الحفاظ على المرجع حاليًا ، لذا أعلن ذلك على الواجهة ، أو إذا كان يحتاج إلى وصول خارجي كخاصية.

@interface MyParentController : UIView {
@private
    MyController* controller;
}

ثم أضفه مثل:

controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

إذا كنت تريد أن يتم جمع الذاكرة لاحقًا ، فما عليك سوى تعيين القيمة على NIL.

لدي فكرة. لقد حدث هذا لي منذ العصور. في IB ، هل خاصية العرض الخاصة بك مدمن مخدرات على وجهة نظرك؟

لقد قمت بإلغاء تحديد هذه ، ولم يتم إطلاق التطبيق مطلقًا.

راجع للشغل ، أسوأ ما يزيد ، ابدأ المشروع مرة أخرى. لا تستحق هذه الصداع إذا فعلت 2 دقيقة من العمل حتى الآن.

مرحبًا بك في عالم برمجة iPhone. قد تحتاج إلى واحد من هذه قريبا إلى حد ما wigsmen.com ؛-)

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