无法识别的选择器发送到实例。为随机对象调用的方法

时间:2010-11-19 15:19:15

标签: iphone

好的,所以这让我完全陷入困境,就像那个here那个确切的问题一样。

我有一个UITableView在视图控制器中有一些行支持自动旋转,有时候,如果我旋转手机,我会得到“EXC_BAD_ACCESS”,有时我会得到带有堆栈跟踪的SIGABRT:

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”.

在这种情况下,调用CABasicAnimation的是numberOfSectionsInTableView,但有时会有类似NSMachPort的类名,这是我从未听说过的。此外,被称为numberOfSectionsInTableView的方法保持不变,类名更改为始终提供doesNotRecognizeSelector例外。

此问题仅在我尝试旋转设备时发生。每当我得到如上所述的堆栈跟踪时,所有系统功能都会使调试变得困难。

真的需要一些专家意见。请阅读上述论坛以明确问题。

2 个答案:

答案 0 :(得分:2)

哇!我以为我已经足够了解NSZombies,但我错了!

我启用了NSZombies导致我:

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

执行“po 0x88dafa0”无法正常工作,因为该对象的内存已被释放。

更多Google搜索引导我到this,其中作者描述了如何查找释放/解除分配的对象。我们只需要在Variables中将MallocStackLoggingNoCompact设置为1以及NSZombieEnabled在环境中设置。

我使用info malloc-history 0xf270740命令得到的输出有一行:

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

该行的代码是:

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

我将[contactsViewController release];行移至dealloc方法,而不是在[self.navigationController presentModalViewController:contactsViewController animated:YES];后立即移动,问题就消失了!

答案 1 :(得分:1)

从启用NSZombies开始。听起来是你过度释放一个物体。