iOS objc_msgSend崩溃,没有提供报告或警告。
iOS objc_msgSend崩溃,没有提供报告或警告。
我正在对我的应用进行测试,加大了负荷,但是它一直崩溃(黑屏,图像不保存,回到了主屏)。然而,在控制台中我没有看到任何崩溃报告被记录。当我使用性能分析工具进行测试时,我只收到一条消息说目标已死,但没有提供任何线索。在组织者中,我得到了设备崩溃日志,其中给了我以下信息,我相信这告诉我我正在向我已释放的某个对象发送消息(objc-msgSend + 22)?我是不是在正确的方向上?\n
---
\n
异常类型:EXC_BAD_ACCESS(SIGSEGV) 异常代码:KERN_INVALID_ADDRESS at 0x576e6f69 崩溃线程:0 线程0名称:Dispatch队列:com.apple.main-thread 线程0崩溃: 0 libobjc.A.dylib 0x34f8ef7e objc_msgSend + 22 1 CoreFoundation 0x371d7e90 CFRetain + 76 2 CoreFoundation 0x371e1b74 +[__NSArrayI __new::] + 48 3 CoreFoundation 0x371e1a8e -[__NSPlaceholderArray initWithObjects:count:] + 294 4 CoreFoundation 0x371e9394 -[NSArray initWithArray:range:copyItems:] + 756 5 CoreFoundation 0x371fcd5a +[NSArray arrayWithArray:] + 66 6 AVFoundation 0x335da766 -[AVCaptureSession outputs] + 146 7 AVFoundation 0x335de26e -[AVCaptureSession _doDidStop:] + 38 8 AVFoundation 0x335dfaea -[AVCaptureSession _handleNotification:payload:] + 2002 9 AVFoundation 0x335d8af6 avcaptureSessionFigRecorderNotification + 1202 10 AVFoundation 0x335fafd8 AVCMNotificationDispatcherCallback + 184 11 CoreFoundation 0x3725b7c8 __CFNotificationCenterAddObserver_block_invoke_0 + 116 12 CoreFoundation 0x3725b540 ___CFXNotificationPost_block_invoke_0 + 64 13 CoreFoundation 0x371e7090 _CFXNotificationPost + 1400 14 CoreFoundation 0x371ef1c6 CFNotificationCenterPostNotification + 102 15 CoreMedia 0x366eeeb0 CMNotificationCenterPostNotification + 112 16 Celestial 0x374b08a2 FigRecorderRemoteCallbacksServer_NotificationIsPending + 478 17 Celestial 0x374b06ba _XNotificationIsPending + 54 18 Celestial 0x374b0678 figrecordercallbacks_server + 92 19 Celestial 0x374af642 remrec_ClientPortCallBack + 146 20 CoreFoundation 0x37258f0c __CFMachPortPerform + 356 21 CoreFoundation 0x3726351c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 22 CoreFoundation 0x372634be __CFRunLoopDoSource1 + 134 23 CoreFoundation 0x3726230c __CFRunLoopRun + 1364 24 CoreFoundation 0x371e549e CFRunLoopRunSpecific + 294 25 CoreFoundation 0x371e5366 CFRunLoopRunInMode + 98 26 AVFoundation 0x335ef4d0 -[AVRunLoopCondition _waitInMode:untilDate:] + 348 27 AVFoundation 0x335ef36c -[AVRunLoopCondition waitUntilDate:inMode:] + 20 28 AVFoundation 0x335dc13a -[AVCaptureSession _stopPreviewing] + 438 29 AVFoundation 0x335dc2d6 -[AVCaptureSession _setRunning:] + 166 30 AVFoundation 0x335dbe42 -[AVCaptureSession stopRunning] + 274 31 zApp 0x0007e1ce 0x79000 + 20942 32 UIKit 0x30fa5b8e -[UIViewController _setViewAppearState:isAnimating:] + 138 33 UIKit 0x30fff8a8 -[UIViewController beginAppearanceTransition:animated:] + 184 34 UIKit 0x310468be -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 4098 35 UIKit 0x31045360 -[UIViewController presentViewController:withTransition:completion:] + 3116 36 UIKit 0x310a06a0 -[UIViewController presentModalViewController:animated:] + 24 37 CoreFoundation 0x371e93f6 -[NSObject performSelector:withObject:withObject:] + 46 38 UIKit 0x30f7ee00 -[UIApplication sendAction:to:from:forEvent:] + 56 39 UIKit 0x30f7edbc -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 24 40 UIKit 0x30f7ed9a -[UIControl sendAction:to:forEvent:] + 38 41 UIKit 0x30f7eb0a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 486 42 UIKit 0x30f7f442 -[UIControl touchesEnded:withEvent:] + 470 43 UIKit 0x30f7d924 -[UIWindow _sendTouchesForEvent:] + 312 44 UIKit 0x30f7d312 -[UIWindow sendEvent:] + 374 45 UIKit 0x30f6368e -[UIApplication sendEvent:] + 350 46 UIKit 0x30f62f34 _UIApplicationHandleEvent + 5820 47 GraphicsServices 0x339a5224 PurpleEventCallback + 876 48 CoreFoundation 0x3726351c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 49 CoreFoundation 0x372634be __CFRunLoopDoSource1 + 134 50 CoreFoundation 0x3726230c __CFRunLoopRun + 1364 51 CoreFoundation 0x371e549e CFRunLoopRunSpecific + 294 52 CoreFoundation 0x371e5366 CFRunLoopRunInMode + 98 53 GraphicsServices 0x339a4432 GSEventRunModal + 130 54 UIKit 0x30f91cce UIApplicationMain + 1074 55 zApp 0x0007ffa6 0x79000 + 28582 56 zApp 0x0007a680 0x79000 + 5760
在iOS开发中,有时候会出现一个问题,即在没有任何报告或警告的情况下,应用程序崩溃了。这个问题的出现原因是当你将一个对象设置为通知的观察者时,并且在它释放时没有将其从观察者列表中移除。系统尝试向该对象发送一条消息,但由于对象已不存在,应用程序崩溃了。
为了解决这个问题,你可以在dealloc函数中添加下面的代码:
[[NSNotificationCenter defaultCenter] removeObserver:self];
即使你使用的是自动引用计数(ARC),也可以创建一个dealloc函数,并在其中添加这行代码。
另外,如果可能的话,你可以考虑使用完成块(completion blocks)来替代观察者模式。完成块更加稳定可靠。
希望这些信息对你有帮助,祝你好运!
1. 如果怀疑存在过度释放的情况,可以尝试在启用NSZombie的情况下运行应用程序。可以通过以下方式启用NSZombie:如何启用NSZombie。
2. 可以设置异常断点以在控制台打印回溯信息。