为什么覆盖@property访问器会导致访问ivar时出错?

时间:2014-01-01 17:16:03

标签: objective-c properties

为什么在访问ivar (i.e. _locked)时覆盖这两个访问器会导致编译错误?如果我只是覆盖了setter而不是getter,一切都很好。

我也尝试了@property(setter=setLocked:, getter=locked)以及其他方法的变体。

MyObject.h

@interface MyObject : NSObject

@property(nonatomic, assign)BOOL locked;

@end

MyObject.m

@implementation MyObject

- (void)setLocked:(BOOL)locked
{
   _locked = locked; // Error here
   // Some other logic
}


- (BOOL)locked
{
   // Some other logic
   return _locked; // Error here
}

@end

2 个答案:

答案 0 :(得分:2)

因为在这种情况下,编译器不会自动为属性合成实例变量,并且_locked将是未定义的。手动合成ivar。

@implementation MyObject

@synthesize locked = _locked;

...

@end

答案 1 :(得分:2)

最新版本的Objective-C不要求您使用@synthesize属性:当缺少一个或两个访问器时,它会执行此操作。 “合成”包括创建一个或两个存取方法,以及用于存储属性值的ivar。

但是,覆盖第二个访问者后,_locked ivar将不再隐式添加到您的类中。因此,您必须自己添加:

@interface MyObject : NSObject {
    BOOL _locked;
}

@property(nonatomic, assign)BOOL locked;

@end