我真的很茫然,這是怎麼發生的。我有一個使用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)