Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么在访问ivar时重写@property访问器会导致错误?_Objective C_Properties - Fatal编程技术网

Objective c 为什么在访问ivar时重写@property访问器会导致错误?

Objective 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 - (

为什么在访问ivar
(即锁定)
时重写这两个访问器会导致编译错误?如果我只是覆盖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更好的方法。