为什么在访问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
答案 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