我最近收到了如下所示的崩溃报告:
0 libobjc.A.dylib 0x0000000193dfea88 object_cxxDestructFromClass(objc_object*, objc_class*) + 0
1 libobjc.A.dylib 0x0000000193e0bf34 objc_destructInstance + 88
2 libobjc.A.dylib 0x0000000193e0bf8c object_dispose + 24
3 我的应用程序 0x00000001000d88fc -[CCAction dealloc] + 44
4 我的应用程序 0x00000001000e6bf8 -[CCActionSequence .cxx_destruct] + 36
5 libobjc.A.dylib 0x0000000193dfeb18 object_cxxDestructFromClass(objc_object*, objc_class*) + 144
6 libobjc.A.dylib 0x0000000193e0bf34 objc_destructInstance + 88
7 libobjc.A.dylib 0x0000000193e0bf8c object_dispose + 24
8 我的应用程序 0x00000001000d88fc -[CCAction dealloc] + 44
9 我的应用程序 0x00000001000e6bf8 -[CCActionSequence .cxx_destruct] + 36
10 libobjc.A.dylib 0x0000000193dfeb18 object_cxxDestructFromClass(objc_object*, objc_class*) + 144
11 libobjc.A.dylib 0x0000000193e0bf34 objc_destructInstance + 88
12 libobjc.A.dylib 0x0000000193e0bf8c object_dispose + 24
13 我的应用程序 0x00000001000d88fc -[CCAction dealloc] + 44
14 我的应用程序 0x00000001000e6bf8 -[CCActionSequence .cxx_destruct] + 36
...它会一直这样下去。 dealloc
中发生某种无限递归,导致堆栈溢出。
只有 2 个方法调用对我可见,其中之一是 .cxx_destruct
,它是 ARC 使用的内部私有(private)方法。另一个是CCAction
的dealloc
方法,里面只有一条log语句:
-(void) dealloc {
CCLOGINFO(@"cocos2d: deallocing %@", self);
}
崩溃真的很难重现;我只见过一次。但是我的应用程序尚未向公众发布,所以我真的很想弄清楚是什么原因造成的。非常感谢任何调试帮助。
我正在使用 Cocos2D 3.3.0
和 iOS 8.1
最佳答案
如果您使用的是 ARC,则在 dealloc
中向 self
发送消息不会像以前在手动内存管理中那样工作。 ARC 在调用 dealloc
之前在 .cxx_destruct
中完成所有清理/处理,因此在 dealloc
中将消息发送到 self
将导致未定义的行为 - 很可能会崩溃。与手动内存管理不同,您可以在调用 [super dealloc]
之前在 dealloc
中向 self
发送消息。
从您的代码看来,CCLogInfo
正在向 self
发送消息,很可能是 [self description]
(假设 CCLogInfo
参数只是带有参数的格式字符串)。这会导致崩溃,但我不确定为什么会导致递归 - 你能把代码分享给 CCLogInfo
吗?
关于ios - libobjc dealloc 中的 KERN_PROTECTION_FAILURE(堆栈溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747131/