调试不会在XCode下重现的NSNotification崩溃

时间:2013-03-26 03:40:56

标签: ios xcode nsnotificationcenter

我的测试版用户平均每小时看到以下崩溃:

0   libobjc.A.dylib                 0x33182f78 objc_msgSend + 16
1   Foundation                      0x3497e4f8 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 12
2   CoreFoundation                  0x35530540 ___CFXNotificationPost_block_invoke_0 + 64
3   CoreFoundation                  0x354bc090 _CFXNotificationPost + 1400
4   Foundation                      0x348f23e4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 60
5   Foundation                      0x348f3c14 -[NSNotificationCenter postNotificationName:object:] + 24
6   libdispatch.dylib               0x338f1c52 _dispatch_call_block_and_release + 6
7   libdispatch.dylib               0x338fce8a _dispatch_main_queue_callback_4CF$VARIANT$up + 190
8   CoreFoundation                  0x355372a6 __CFRunLoopRun + 1262
9   CoreFoundation                  0x354ba49e CFRunLoopRunSpecific + 294
10  CoreFoundation                  0x354ba366 CFRunLoopRunInMode + 98
11  GraphicsServices                0x33255432 GSEventRunModal + 130
12  UIKit                           0x32c92cce UIApplicationMain + 1074
13  Ars Logica                      0x00039ecc main (main.m:16)
14  Ars Logica                      0x00039e80 start + 32

我有两个并发症:

1)我没有打电话给NSNotificationCenter。

2)尽管经过了广泛的努力,我还没有在使用XCode时发生这种情况。

我可以在低内存报告和崩溃事件之间找到相关性。

坦率地说,我不确定从哪里开始。并发症2号显然是个大问题。

非常感谢任何建议或指示。


作为记录,事实证明这是iAd框架中的崩溃。具体来说,我按照Apple示例保留了一整页插页式广告,但是当我进入后台时,我并没有让它失效。当我离开后台时,有时会收到一条通知,说明广告服务器的附件已丢失,并已发送到旧的上下文。转到后台时广告上下文无效,可以很好地修复所有内容。

1 个答案:

答案 0 :(得分:4)

您最好的选择可能是使用方法调配和替换类别:

+ addObserver:selector:name:object:
NSNotificationCenter

使用您自己的版本记录所有参数的内容,然后调用真实版本。这样,当您的测试人员看到崩溃时,他们可以查看设备日志,以查看传入该方法的最后一件事情。这可能会让您有足够的洞察力来确定系统的哪个区域正在使用通知中心。

另外,你使用ARC吗?使用ARC我会非常惊讶,如果这样的错误可能发生,似乎你正在将一些东西传递到系统中,然后在某种程度上在幕后附加到通知,但是在系统仍有引用的情况下被释放。

以下是与您的需求相关的方法调整的一个示例(替换类级别方法):

How to swizzle a class method on iOS?

显然,没有这样的货物运到商店......