我在自定义类中覆盖- (BOOL) isEqual:(id)object
。
__weak
,__strong
,__autoreleasing
和__unsafe_unretained
这四个选项中的哪一个应该用于{{1}的参数方法签名?
我认为这就是问题所在,因为当我尝试将我的班级实例添加到isEqual:
时,我会在声明中获得NSMutableDictionary
方法。
换句话说,调试器获取EXC_BAD_ACCESS(code=2, address=0x10)
的行是:
EXC_BAD_ACCESS
在任何方法体执行之前。
答案 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
复制该行,则汇编代码会针对不同的类型限定符进行更改。