这是我在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'。为什么这段代码没有正确编译?
答案 0 :(得分:10)
它抱怨,因为支持变量NSObject *objWeek
被声明为__strong
(所有其他未注释的Objective C指向可保留对象的指针是__strong
)。将支持变量更改为__weak NSObject *objWeek
,编译器会再次喜欢你。
编辑:根据要求,来自LLVM铿锵声的ARC文档:
4.4.1。对象
如果使用可保留对象所有者类型声明对象,但是 没有明确的所有权限定符,其类型是隐式的 调整为具有__strong资格。
作为一种特殊情况,如果对象的基类型是Class(可能是 protocol-qualified),将类型调整为__unsafe_unretained 而不是资格。
链接:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference
答案 1 :(得分:1)
我面临同样的问题。我确实花了很多时间在这最后我可以通过清理项目来解决这个问题。这就是方式....
产品 - >清洁
原因是您可能会删除控制器类(ViewController)但仍未将其从项目中删除。当您完成项目清理后,错误将自动消失。这对我有用......