这是我在iOS上使用ARC的简单代码:
@interface Person : NSObject {
NSObject *objStrong;
NSObject *objWeek;
}
@property(strong) NSObject *objStrong;
//getting error at this line
@property(weak) NSObject *objWeek; //Existing ivar 'objWeek' for _week property 'objWeek' must be _week
@end
@implementation Person
@synthesize objStrong;
@synthesize objWeek;
@end
当我尝试编译时,编译器会抱怨_weak属性'objWeek'现有的ivar'objWeek'。为什么此代码无法正确编译?
最佳答案
抱怨是因为后备变量NSObject *objWeek
被声明为__strong
(指向可保留对象的所有其他未注释的Objective C指针都是__strong
)。将后备变量更改为__weak NSObject *objWeek
,编译器将再次喜欢您。
编辑:根据要求,来自LLVM的clang的ARC文档:
4.4.1。对象
如果使用可保留对象所有者类型声明了对象,但是
没有明确的所有权限定词,其类型是隐式的
调整为具有__strong资格。
作为特殊情况,如果对象的基本类型为Class(可能是
协议限定),将类型调整为具有__unsafe_unretained
资格代替。
链接:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference