2013-03-26 70 views
0

我的测试用户看到下面的崩溃,平均一小时一次:调试NSNotification崩溃,不会下的XCode重现

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示例进行投放,但是当我投入背景时,我并没有使其失效。当我退出后台时,有时会发送一条通知,指出广告服务器的附件已丢失,并已发送到旧的上下文。去背景时使广告上下文失效,很好地解决了所有问题。

+0

一轻微的挑剔问题,它是Xcode,而不是XCode。 – Till 2013-03-26 04:07:28

+0

好挑剔:-) – 2013-03-26 05:44:41

回答

4

您最好的选择可能是使用方法交叉混合和类别来代替:

+ addObserver:selector:name:object: 

NSNotificationCenter

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

另外,你使用ARC?使用ARC我会非常惊讶,如果这样的错误可能会发生,似乎你传递了一些东西到系统中,然后通过某种方式在后台附加通知,但是在系统仍然有引用时被释放。

这里的方法混写有关自己的需要(替换一流水平的方法)的一个例子:

How to swizzle a class method on iOS?

显然不运送到与到位商店...

+0

+1很好的答案! – Till 2013-03-26 04:06:25

+0

我使用ARC,我很惊讶,因为你是同样的原因... – 2013-03-26 05:50:00

+0

我害怕这一点,更多的伐木是我最担心的,然后我害怕。同样,在XCode中,当你在代码的不同部分中时,你是否尝试过在模拟器中重复触发内存警告? – 2013-03-26 05:52:07