Objective c 为什么在访问ivar时重写@property访问器会导致错误?
为什么在访问ivarObjective c 为什么在访问ivar时重写@property访问器会导致错误?,objective-c,properties,Objective C,Properties,为什么在访问ivar(即锁定)时重写这两个访问器会导致编译错误?如果我只是覆盖setter而不是getter,那么一切都很好 我还尝试了@property(setter=setLocked:,getter=locked)和其他方法的变体 MyObject.h @interface MyObject : NSObject @property(nonatomic, assign)BOOL locked; @end MyObject.m @implementation MyObject - (
(即锁定)
时重写这两个访问器会导致编译错误?如果我只是覆盖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
因为在这种情况下,编译器不会自动合成属性的实例变量,
\u locked
将是未定义的。人工合成ivar
@implementation MyObject
@synthesize locked = _locked;
...
@end
因为在这种情况下,编译器不会自动合成属性的实例变量,
\u locked
将是未定义的。人工合成ivar
@implementation MyObject
@synthesize locked = _locked;
...
@end
最新版本的Objective-C不要求您合成属性:当一个或两个访问器丢失时,它会这样做。“合成”包括创建一个或两个访问器方法,以及用于存储属性值的ivar 但是,一旦覆盖了第二个访问器,
\u locked
ivar将不再隐式添加到类中。因此,您必须自己添加它:
@interface MyObject : NSObject {
BOOL _locked;
}
@property(nonatomic, assign)BOOL locked;
@end
最新版本的Objective-C不要求您合成属性:当一个或两个访问器丢失时,它会这样做。“合成”包括创建一个或两个访问器方法,以及用于存储属性值的ivar 但是,一旦覆盖了第二个访问器,
\u locked
ivar将不再隐式添加到类中。因此,您必须自己添加它:
@interface MyObject : NSObject {
BOOL _locked;
}
@property(nonatomic, assign)BOOL locked;
@end
如果指定一个getter和setter,它不会自动合成。我昨晚看到了一个完全相同的副本。。。找不到now@AndrewMadsen这绝对是重复的。谢谢我将删除它。如果指定一个getter和setter,它不会自动合成。我昨晚看到了一个完全相同的副本。。。找不到now@AndrewMadsen这绝对是重复的。谢谢我将删除它。+1我认为这是一种比显式声明ivar更好的方法。+1我认为这是一种比显式声明ivar更好的方法。