Iphone SEGV_ACCERR在dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self]
我真的不知道这是怎么发生的。我有一个使用ARC的应用程序。大多数“我的视图”控制器都注册NSI通知。所有注册都在主线程上完成 当出现内存警告时,用于每个不可见选项卡的导航控制器为零,因此被解除分配。在本例中,一个导航控制器及其视图控制器被解除分配,视图控制器在其解除分配方法期间使应用程序崩溃 具体来说,它正在从所有NSNotificationCenter通知中删除自己 dealloc方法也在主线程中运行,所以我不认为这是线程问题 崩溃的行是Iphone SEGV_ACCERR在dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self],iphone,objective-c,ios,foundation,Iphone,Objective C,Ios,Foundation,我真的不知道这是怎么发生的。我有一个使用ARC的应用程序。大多数“我的视图”控制器都注册NSI通知。所有注册都在主线程上完成 当出现内存警告时,用于每个不可见选项卡的导航控制器为零,因此被解除分配。在本例中,一个导航控制器及其视图控制器被解除分配,视图控制器在其解除分配方法期间使应用程序崩溃 具体来说,它正在从所有NSNotificationCenter通知中删除自己 dealloc方法也在主线程中运行,所以我不认为这是线程问题 崩溃的行是-[SearchTabViewController解除锁
-[SearchTabViewController解除锁定](SearchTabViewController.m:44)
代码中的那一行是:[[NSNotificationCenter defaultCenter]removeObserver:self]代码>
实际的崩溃原因似乎是引用了解除分配的对象
问题是这里只发送了两条消息,defaultCenter
消息发送到NSNotificationCenter
类(因为它是一个类,所以永远不能是无效引用)和removeObserver:
消息发送到默认中心对象(也不能解除分配,因为它是一个单件)
唯一引用的另一个对象是self,它还不能被释放,因为我们仍然使用该对象的“dealloc”方法…基本上不应该发生这种崩溃
这里有我遗漏的东西吗?下面是坠机日志的相关部分:
因此,崩溃日志有误导性。我最终能够在连接到启用了僵尸对象的调试器时使其发生。崩溃的实际来源是一个加载程序对象,该对象将此控制器作为其委托,在控制器解除分配后尝试调用委托方法之一
现在在dealloc中,我取消了加载程序的委托,并在激活时取消加载,瞧,没有更多的崩溃
此外,值得注意的是,这个崩溃拒绝在模拟器中发生,但几乎每次都发生在设备上。因此,当跟踪奇怪的内存错误时,不幸的是僵尸工具并不总是可行的工具,因为它要求应用程序在模拟器中运行
所以,下一个最好的方法是去编辑Scheme并在那里启用zombie对象,然后在设备上构建并运行,等待它崩溃。这样,您无法获得完整的保留/发布历史记录,但在这种情况下,它可以提供足够的信息来跟踪其他难以解决的问题
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)