这是我在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

10-08 06:03