- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 objective-c 和 xcode 的新手,我目前正在编写的应用程序收到臭名昭著的 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/
是否可以将我的应用程序的用户从我的 Android 应用程序重定向到我在最近发布的 Pebble 商店中的表盘条目? 从技术上讲,我想知道新的 2.0.0 Pebble 应用程序是否捕获任何 URI
是否可以启动 genius scan(或类似的东西,只要它是免费的)作为获取其图片的 Intent ?或者让它出现在“打开方式”对话框中?我已经尝试联系制造商并用谷歌搜索了这个问题。 最佳答案 更新
我是一名优秀的程序员,十分优秀!