2013-03-26 36 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