2012-10-15 54 views
1

我真的很茫然,這是怎麼發生的。我有一個使用ARC的應用程序。我的大多數視圖控制器都註冊了NSNotifications。所有註冊都在主線程完成。SEGV_ACCERR調用[[NSNotificationCenter defaultCenter] removeObserver:self] in dealloc

當發生內存警告時,用於每個不可見選項卡的導航控制器將被清零並因此被釋放。在這種情況下,一個導航控制器及其視圖控制器被解除分配,並且視圖控制器在其dealloc方法期間使應用程序崩潰。

具體來說,它是從所有NSNotificationCenter通知中刪除自己。

dealloc方法也在主線程中運行,所以我不明白這可能是一個線程問題。

的墜毀線是-[SearchTabViewController dealloc] (SearchTabViewController.m:44)

即在代碼行是:[[NSNotificationCenter defaultCenter] removeObserver:self];

實際碰撞的原因似乎是objc_msgSend引用解除分配的對象。

與的問題是,這裏有正在發送僅2個消息,該defaultCenter消息到NSNotificationCenter類(其決不可能的無效引用,因爲它是一個類),並且removeObserver:消息到默認中心對象(也永遠不會被釋放,因爲它是一個單身人士)。

引用的唯一的另一個對象是self,它不能被釋放,因爲我們仍然在該對象的「dealloc」方法中...基本上這個崩潰不應該發生。

有什麼我在這裏失蹤?下面的崩潰日誌的相關部分:


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

Thread 0 Crashed: 
0 libobjc.A.dylib      0x000035b0 objc_msgSend + 16 
1 Anghami Beta      0x000c7473 -[SearchTabViewController dealloc] (SearchTabViewController.m:44) 
2 CoreFoundation      0x00003311 CFRelease + 101 
3 CoreFoundation      0x0000d95d -[__NSArrayM dealloc] + 141 
4 Anghami Beta      0x0033e73f -[EX2NavigationController .cxx_destruct] (EX2NavigationController.m:51) 
5 libobjc.A.dylib      0x00007f3d object_cxxDestructFromClass(objc_object*, objc_class*) + 57 
6 libobjc.A.dylib      0x000050d3 objc_destructInstance + 35 
7 libobjc.A.dylib      0x000053a7 object_dispose + 15 
8 UIKit        0x000cec89 -[UIViewController dealloc] + 1181 
9 CoreFoundation      0x00003311 CFRelease + 101 
10 CoreFoundation      0x0000da13 -[__NSArrayI dealloc] + 79 
11 libobjc.A.dylib      0x00005489 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 169 
12 CoreFoundation      0x00005441 _CFAutoreleasePoolPop + 17 
13 CoreFoundation      0x00095f41 __CFRunLoopRun + 1297 
14 CoreFoundation      0x00008ebd CFRunLoopRunSpecific + 357 
15 CoreFoundation      0x00008d49 CFRunLoopRunInMode + 105 
16 GraphicsServices     0x000052eb GSEventRunModal + 75 
17 UIKit        0x00057301 UIApplicationMain + 1121 
18 Anghami Beta      0x0000334d main (main.m:17) 

回答

3

所以它變成了崩潰日誌是誤導。我能夠最終在啓用殭屍對象的情況下連接到調試器時發生。崩潰的實際來源是一個加載器對象,它擁有這個控制器,因爲它是委託,在控制器被釋放後試圖調用其中一個委託方法。

現在在dealloc中,我沒有裝載程序的委託,並取消加載,如果活動,並沒有更多的崩潰。


此外,值得注意的是,這個崩潰在模擬器中拒絕發生,但幾乎每次都在設備上發生。因此,當追蹤奇怪的內存錯誤時,不幸的是殭屍工具並不總是一個可行的工具,因爲它需要應用程序在模擬器中運行。

所以接下來最好的是去編輯計劃,並在那裏啓用殭屍對象,然後在設備上生成並運行,並等待它崩潰。您沒有那樣獲得完整的保留/發佈歷史記錄,但是在這種情況下,它可以提供足夠的信息來追蹤一個難以解決的問題。

相關問題