如何确定由于dealloced ed observer导致哪个NSNotification崩溃

Jay*_*ais 10 cocoa-touch objective-c crash-reports nsnotification nsnotificationcenter

使用的黄金法则NSNotification似乎是

" removeObserverobserver(或object)之前的呼叫被解除分配".

我正在处理一个没有遵循此规则的代码库,但我无法找到违规行为.我搜索了代码并确保每个addObserver都有匹配removeObserver但我仍然看到以下变化的崩溃报告:

OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x8
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x31516fbc objc_msgSend + 16
1   Foundation                          0x3195b50f __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 19
2   CoreFoundation                      0x37a02577 ___CFXNotificationPost_block_invoke_0 + 71
3   CoreFoundation                      0x3798e0cf _CFXNotificationPost + 1407
4   Foundation                          0x318cf3fb -[NSNotificationCenter postNotificationName:object:userInfo:] + 67
5   UIKit                               0x34e5ee25 -[UIApplication _handleApplicationSuspend:eventInfo:] + 697
6   UIKit                               0x34deed17 -[UIApplication handleEvent:withNewEvent:] + 2031
7   UIKit                               0x34dee3bf -[UIApplication sendEvent:] + 55
8   UIKit                               0x34dedd2d _UIApplicationHandleEvent + 5809
9   GraphicsServices                    0x3750bdf3 PurpleEventCallback + 883
10  CoreFoundation                      0x37a0a553 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 39
11  CoreFoundation                      0x37a0a4f5 __CFRunLoopDoSource1 + 141
12  CoreFoundation                      0x37a09343 __CFRunLoopRun + 1371
13  CoreFoundation                      0x3798c4dd CFRunLoopRunSpecific + 301
14  CoreFoundation                      0x3798c3a5 CFRunLoopRunInMode + 105
15  GraphicsServices                    0x3750afcd GSEventRunModal + 157
16  UIKit                               0x34e1c743 UIApplicationMain + 1091
17  App                                 0x00002d2f main (main.m:14)
Run Code Online (Sandbox Code Playgroud)

我对此崩溃报告的解释[UIApplication _handleApplicationSuspend:eventInfo:]是发布一个通知,观察者在被删除之前已被解除分配.

假设这种解释是正确的,我将如何确定发布哪个通知?理想情况下,解除分配的对象类型是什么?

Cos*_*que 6

您可以使用调试器命令设置符号断点-[NSNotificationCenter postNotificationName:object:userInfo:]并打印传递给它的第三个参数(第一个是NSNotificationCenter第二个参数_cmd)po.

  • 为了添加更多细节,我按照建议在`[NSNotificationCenter postNotificationName:object:userInfo:]`中添加了一个符号断点,并将断点的"action"设置为"po $ r2"的"调试器命令".当在设备上运行应用程序并暂停它时,我看到在`[UIApplication _handleApplicationSuspend:eventInfo:]`期间发布了很多通知,但是与崩溃报告调用堆栈匹配的唯一通知是`UIApplicationSuspendedNotification`和`UIApplicationDidEnterBackgroundNotification`(可预测) (3认同)