Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone SEGV_ACCERR在dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self]_Iphone_Objective C_Ios_Foundation - Fatal编程技术网

Iphone SEGV_ACCERR在dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self]

Iphone SEGV_ACCERR在dealloc中调用[[NSNotificationCenter defaultCenter]removeObserver:self],iphone,objective-c,ios,foundation,Iphone,Objective C,Ios,Foundation,我真的不知道这是怎么发生的。我有一个使用ARC的应用程序。大多数“我的视图”控制器都注册NSI通知。所有注册都在主线程上完成 当出现内存警告时,用于每个不可见选项卡的导航控制器为零,因此被解除分配。在本例中,一个导航控制器及其视图控制器被解除分配,视图控制器在其解除分配方法期间使应用程序崩溃 具体来说,它正在从所有NSNotificationCenter通知中删除自己 dealloc方法也在主线程中运行,所以我不认为这是线程问题 崩溃的行是-[SearchTabViewController解除锁

我真的不知道这是怎么发生的。我有一个使用ARC的应用程序。大多数“我的视图”控制器都注册NSI通知。所有注册都在主线程上完成

当出现内存警告时,用于每个不可见选项卡的导航控制器为零,因此被解除分配。在本例中,一个导航控制器及其视图控制器被解除分配,视图控制器在其解除分配方法期间使应用程序崩溃

具体来说,它正在从所有NSNotificationCenter通知中删除自己

dealloc方法也在主线程中运行,所以我不认为这是线程问题

崩溃的行是
-[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)