覆盖-isEqual时参数的强弱(或其他):?

时间:2012-07-09 17:58:47

标签: objective-c automatic-ref-counting

我在自定义类中覆盖- (BOOL) isEqual:(id)object

__weak__strong__autoreleasing__unsafe_unretained这四个选项中的哪一个应该用于{{1}的参数方法签名?

我认为这就是问题所在,因为当我尝试将我的班级实例添加到isEqual:时,我会在声明中获得NSMutableDictionary方法。

换句话说,调试器获取EXC_BAD_ACCESS(code=2, address=0x10)的行是:

EXC_BAD_ACCESS
在任何方法体执行之前

2 个答案:

答案 0 :(得分:1)

正确的答案是“如果你的访问权限不好,那么你就是在尝试阅读或写入一个没有你认为的内容的区域。”,@ Dustin Rowland评论

答案 1 :(得分:0)

默认情况下,ARC使用__strong,这意味着参数在方法内使用的持续时间内通过retain / release保存。要导致EXC_BAD_ACCESS,在访问它时,必须过度释放对象(参数本身或在isEqual:实现中的方法调用中使用的任何其他对象)。无法通过更改限定符来解决此问题。

旁注:虽然期望在更改限定符时看到任何更改,但要小心。编译器优化可能会决定跳过某些调用是安全的。例如,将以下代码添加到文件中,然后查看用于存档的程序集(Product - > Generate Output - > Assembly File)(使用-Os)。

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

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

虽然logObject:的参数是默认的__strong,但在程序集输出中没有保留/释放。将-logObject:的参数更改为__strong__weak__unsafe_unretained__autoreleasing可提供完全相同的程序集输出。但是,如果使用NSLog复制该行,则汇编代码会针对不同的类型限定符进行更改。