libobjc dealloc中的KERN_PROTECTION_FAILURE(堆栈溢出)

时间:2015-01-02 18:58:11

标签: ios objective-c iphone cocos2d-iphone stack-overflow

我最近收到的崩溃报告如下:

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

1 个答案:

答案 0 :(得分:1)

如果您使用的是ARC,则向self中的dealloc发送消息的方式与手动内存管理中的方式不同。 ARC在调用.cxx_destruct之前完成dealloc中的所有清理/处理,因此向self中的dealloc发送消息将导致未定义的行为 - 最有可能崩溃。与手动内存管理不同,您可以在调用self之前向dealloc中的[super dealloc]发送消息。

从您的代码看,CCLogInfo正在向self发送消息,很可能是[self description](假设CCLogInfo参数只是带参数的格式字符串)。这会导致崩溃,但我不确定它导致递归的原因 - 您可以将代码共享到CCLogInfo吗?