我的测试版用户平均每小时会遇到一次以下崩溃:
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 示例准备了一个整页插页式广告,但当我进入后台时我并没有使它无效。当我从后台出来时,有时会向旧上下文发送一条通知,说广告服务器的附件已丢失。进入后台时使广告上下文无效可以很好地解决所有问题。
最佳答案
你最好的选择可能是使用方法混合和一个类别来替换:
+ addObserver:selector:name:object:
在 NSNotificationCenter 中。
使用您自己的版本记录所有参数的内容,然后调用真实版本。这样,当您的测试人员看到崩溃时,他们可以查看设备日志以查看传递给该方法的最后一件事正在做什么。这可能会让您有足够的洞察力来找出系统的哪个区域正在使用通知中心。
另外,你在使用 ARC 吗?使用 ARC 如果可能发生这样的错误,我会感到非常惊讶,看起来你正在将某些东西传递到系统中,然后以某种方式在幕后附加到通知,但在系统仍然有引用时被释放。
这是一个与您的需求相关的方法调配示例(替换类级别的方法):
How to swizzle a class method on iOS?
显然不要带着它去商店...
关于ios - 调试在 XCode 下不会重现的 NSNotification 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15629000/