gpt4 book ai didi

有意向已释放对象发送消息的 Objective-c 示例代码

转载 作者:太空狗 更新时间:2023-10-30 04:00:53 24 4
gpt4 key购买 nike

我是 objective-cxcode 的新手,我目前正在编写的应用程序收到臭名昭著的 EXC_BAD_ACCESS 错误。

几乎每个人都建议开始使用NSZombies 来解决问题。我认为我的 NSZombies 正在运行,但 xcode 没有在我的应用程序崩溃时向我发出关于 zombie 的警报。

在我继续调试之前,我想运行一些代码,这些代码肯定会导致将消息发送到僵尸(取消分配的对象)。

什么是一个简单的代码片段,其中一条消息被发送到一个已释放的对象,导致 NSZombies 应该提醒我的场景?

最佳答案

对于非 ARC 代码:

- (IBAction) messageZombie:(id)sender {
id a = [[NSObject alloc]init];
[a release];
NSLog(@"%@", [a description]);
}

这将在 Zombies 关闭时为您提供 EXC_BAD_ACCESS,并在启用 Zombies 的情况下提供“消息已发送到已解除分配的实例”消息。

如果您的项目正在使用 ARC,那么要可靠地导致消息解除分配的对象会有点困难(毕竟,这就是 ARC 的要点)。

这个有效:

- (IBAction) messageZombie:(id)sender {    
id a = [[NSObject alloc]init];
id __unsafe_unretained b =a;
a=nil;
NSLog(@"%@", [b description]);
}

它可能与您的实际代码所做的不太相似,因为到底谁在使用 __unsafe_unretained?但是,如果您只想确保已正确打开 NSZombies,这应该是一个合理的测试用例。

如果您正在寻找代码中的可疑位置,那么一定要寻找 __unsafe_unretained 指针,尽管您不会找到任何*,并仔细检查是否将正确的转换用于转换为 Cocoa 的 CoreFoundation 对象对象。

* 如果你的项目需要支持 10.7 之前的 OS X 版本,或者 5.0 之前的 iOS 版本,那么你不能使用 __weak 指针,所以在这类项目中,你会发现 __unsafe_unretained 的使用频率更高。

关于有意向已释放对象发送消息的 Objective-c 示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016040/

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