开发者

unrecognized selector sent to instance. Method being called for random objects

Ok, so this has me completely stumped just like the guy here with the exact problem.

I have a UITableView with some rows in a view controller which supports autorotation and sometimes, if i rotate the phone, i get "EXC_BAD_ACCESS" and sometimes i get SIGABRT with a stack trace like:

2010-11-19 16:51:05.634 [2306:307] -[CABasicAnimation numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x58207d0
2010-11-19 16:51:05.688 [2306:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CABasicAnimation numberOfSectionsInTableView:]: unrecognized selector sent to instance 0x58207d0'
*** Call stack at first throw:
(
 0   CoreFoundation                      0x344aaed3 __exceptionPreprocess + 114
 1   libobjc.A.dylib                     0x33975811 objc_exception_throw + 24
 2   CoreFoundation                      0x344ac683 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
 3   CoreFoundation                      0x344541d9 ___forwarding___ + 508
 4   CoreFoundation                      0x34453f90 _CF_forwarding_prep_0 + 48
 5   UIKit                               0x31b20717 -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] + 66
 6   UIKit                               0x31b20677 -[UITableViewRowData invalidateAllSections] + 50
 7   UIKit                               0x31b2048d -[UITableView(_UITableViewPrivate) _updateRowData] + 64
 8   UIKit                               0x31b22941 -[UITableView(_UITableViewPrivate) _ensureRowDataIsLoaded] + 24
 9   UIKit                               0x31b22909 -[UITableView numberOfSections] + 16
 10  UIKit                               0x31bd114f -[UISearchDisplayController _updateNoSearchResultsMessageVisiblity] + 54
 11  UIKit                开发者_运维问答               0x31cfbef7 -[UISearchDisplayController windowWillAnimateRotation:] + 478
 12  Foundation                          0x3325d6b3 _nsnote_callback + 142
 13  CoreFoundation                      0x34431713 __CFXNotificationPost_old + 402
 14  CoreFoundation                      0x344313b3 _CFXNotificationPostNotification + 118
 15  Foundation                          0x3324cdb7 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
 16  UIKit                               0x31b5dbb7 -[UIWindow _setRotatableClient:toOrientation:duration:force:] + 3114
 17  UIKit                               0x31b64013 -[UIWindow _setRotatableViewOrientation:duration:force:] + 50
 18  UIKit                               0x31b39a0f -[UIWindow _updateToInterfaceOrientation:duration:force:] + 74
 19  UIKit                               0x31b39be9 -[UIWindow _updateInterfaceOrientationFromDeviceOrientation:] + 112
 20  UIKit                               0x31b39b15 -[UIWindow _handleDeviceOrientationChange:] + 88
 21  Foundation                          0x3325d6b3 _nsnote_callback + 142
 22  CoreFoundation                      0x34431713 __CFXNotificationPost_old + 402
 23  CoreFoundation                      0x344313b3 _CFXNotificationPostNotification + 118
 24  Foundation                          0x3324cdb7 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
 25  UIKit                               0x31b0d0ed -[UIDevice setOrientation:animated:] + 144
 26  UIKit                               0x31b2a51b -[UIApplication handleEvent:withNewEvent:] + 2738
 27  UIKit                               0x31b29901 -[UIApplication sendEvent:] + 44
 28  UIKit                               0x31b29337 _UIApplicationHandleEvent + 5110
 29  GraphicsServices                    0x3026c04b PurpleEventCallback + 666
 30  CoreFoundation                      0x3443fce3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
 31  CoreFoundation                      0x3443fca7 __CFRunLoopDoSource1 + 166
 32  CoreFoundation                      0x3443256d __CFRunLoopRun + 520
 33  CoreFoundation                      0x34432277 CFRunLoopRunSpecific + 230
 34  CoreFoundation                      0x3443217f CFRunLoopRunInMode + 58
 35  GraphicsServices                    0x3026b5f3 GSEventRunModal + 114
 36  GraphicsServices                    0x3026b69f GSEventRun + 62
 37  UIKit                               0x31ad0123 -[UIApplication _run] + 402
 38  UIKit                               0x31ace12f UIApplicationMain + 670
 39  App                                 0x0000285f main + 70
 40  App                            0x00002814 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.

In this case it is CABasicAnimation on which numberOfSectionsInTableView is being called but sometimes there are class names like NSMachPort which i have never heard of. Also, the method being called numberOfSectionsInTableView remains the same with the class names changing to always give a doesNotRecognizeSelector exception.

Also this problem only happens when i try to rotate the device. Whenever i get a stack trace like above, there are all system functions which makes it difficult to debug.

Really need some expert advice on this. Please read the forum mentioned above to be clear about the issue.


Whoa! I thought i knew NSZombies enough but i was wrong!

I enabled NSZombies which led me to:

*** -[ContactsViewController numberOfSectionsInTableView:]: message sent to deallocated instance 0x88dafa0

Doing "po 0x88dafa0" wont work because that object's memory was already freed.

Some more Googling led me to this where the author describes how to find freed/deallocated objects. We just have to set MallocStackLoggingNoCompact to 1 in the Variables to be set in the environment along with NSZombieEnabled.

The output i got with the info malloc-history 0xf270740 command had a line:

-[VoicePlayController actionSheet:clickedButtonAtIndex:] at /Users/Documents/Xcode Projects/Classes/VoicePlayController.m:454

The code on that line is:

contactsViewController = [[ContactsViewController alloc] initWithNibName:@"ContactsViewController" bundle:nil];

I moved the [contactsViewController release]; line to dealloc method instead of immediately after [self.navigationController presentModalViewController:contactsViewController animated:YES]; and the problem is gone!


Start with enabling NSZombies. What it sounds like is you are over-releasing an object.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜