0

- (BOOL) isEqual:(id)object在一个自定义类中重写。

在、、 和4 个选项中,__weak我应该在方法签名的参数上使用哪一个?__strong__autoreleasing__unsafe_unretainedisEqual:

我认为这就是问题所在,因为当我尝试将我的类的实例添加到 aNSMutableDictionary时,我EXC_BAD_ACCESS(code=2, address=0x10)在方法的声明中得到了 a 。

换句话说,调试器获取的行EXC_BAD_ACCESS是:

- (BOOL) isEqual:(id __strong)object {

在执行任何方法体之前。

4

2 回答 2

1

正确的答案是“如果您的访问权限不正确,那么您正在尝试读取或写入一个没有您认为其中包含的内容的区域。”,@Dustin Rowland 在评论中说。

于 2012-07-13T16:42:25.273 回答
0

默认情况下,ARC 使用__strong,这意味着参数在方法内使用期间通过保留/释放保留。为了导致EXC_BAD_ACCESS,一个对象(参数本身,或者在isEqual:实现内部的方法调用中使用的任何其他对象)在访问它时必须被过度释放。这不能通过更改限定符来解决。

旁注:但要小心,当您更改限定符时会看到任何变化。编译器优化可能决定跳过某些调用是安全的。例如,将以下代码添加到文件并查看用于归档的程序集(产品 -> 生成输出 -> 程序集文件)(使用 -Os)。

- (void)logObject:(id)o
{
    NSLog(@"%@", o);
}

- (void)call
{
    id o = [[NSObject alloc] init];
    [self logObject:o];
}

尽管参数 oflogObject:是默认值__strong,但在程序集输出中没有保留/释放。将参数更改为-logObject:__strong__weak给出完全相同的程序集输出__unsafe_unretained__autoreleasing但是,如果您使用 the 复制该行,NSLog则不同类型限定符的汇编代码会发生变化。

于 2012-07-11T16:40:41.823 回答