我最近收到的崩溃报告如下:
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 My App 0x00000001000d88fc -[CCAction dealloc] + 44
4 My App 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 My App 0x00000001000d88fc -[CCAction dealloc] + 44
9 My App 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 My App 0x00000001000d88fc -[CCAction dealloc] + 44
14 My App 0x00000001000e6bf8 -[CCActionSequence .cxx_destruct] + 36
......它会永远继续下去。 dealloc
中发生的某种无限递归导致堆栈溢出。
我只能看到2个方法调用,其中一个是.cxx_destruct
,这是ARC使用的内部私有方法。另一种是dealloc
的{{1}}方法,其中只有一个日志语句:
CCAction
崩溃真的难以重现;我只见过一次。但是我的应用还没有向公众发布,所以我真的想弄明白是什么导致了它。任何帮助调试这将非常感谢。
我正在使用-(void) dealloc {
CCLOGINFO(@"cocos2d: deallocing %@", self);
}
和Cocos2D 3.3.0
答案 0 :(得分:1)
如果您使用的是ARC,则向self
中的dealloc
发送消息的方式与手动内存管理中的方式不同。 ARC在调用.cxx_destruct
之前完成dealloc
中的所有清理/处理,因此向self
中的dealloc
发送消息将导致未定义的行为 - 最有可能崩溃。与手动内存管理不同,您可以在调用self
之前向dealloc
中的[super dealloc]
发送消息。
从您的代码看,CCLogInfo
正在向self
发送消息,很可能是[self description]
(假设CCLogInfo
参数只是带参数的格式字符串)。这会导致崩溃,但我不确定它导致递归的原因 - 您可以将代码共享到CCLogInfo
吗?