gpt4 book ai didi

ios - libobjc dealloc 中的 KERN_PROTECTION_FAILURE(堆栈溢出)

转载 作者:行者123 更新时间:2023-11-29 12:30:57 27 4
gpt4 key购买 nike

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

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)方法。另一个是CCActiondealloc方法,里面只有一条log语句:

-(void) dealloc {
CCLOGINFO(@"cocos2d: deallocing %@", self);
}

崩溃真的很难重现;我只见过一次。但是我的应用程序尚未向公众发布,所以我真的很想弄清楚是什么原因造成的。非常感谢任何调试帮助。

我正在使用 Cocos2D 3.3.0iOS 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com