Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 使用实例变量或getter方法时的iOS_Objective C_Ios_Properties_Accessor - Fatal编程技术网

Objective c 使用实例变量或getter方法时的iOS

Objective c 使用实例变量或getter方法时的iOS,objective-c,ios,properties,accessor,Objective C,Ios,Properties,Accessor,我有一个关于使用getter和实例变量的问题。让我们看一个例子 假设在.h文件中有: @property (nonatomic,strong) NSString *name 在.m文件中,我以如下方式合成该变量: @synthesize name = _name; 现在我的问题是:使用之间的区别是什么: [self.name aMethod] 及 谢谢 [self.name aMethod] 相当于 [[self name] aMethod] 因此,调用getter并将消息发送到其结果

我有一个关于使用getter和实例变量的问题。让我们看一个例子

假设在.h文件中有:

@property (nonatomic,strong) NSString *name
在.m文件中,我以如下方式合成该变量:

@synthesize name = _name;
现在我的问题是:使用之间的区别是什么:

[self.name aMethod]

谢谢

[self.name aMethod]
相当于

[[self name] aMethod]
因此,调用getter并将消息发送到其结果

在您的情况下,可见结果将是相同的


但是,如果getter不是微不足道的(即合成的),则情况可能并非如此。

第一个getter通过getter方法访问ivar。第二个直接访问ivar。由于它是一个简单的合成属性,所以除了第一个属性进行额外的方法调用外,没有太大区别。然而,如果属性是原子的,或者是动态的,或者getter方法是复杂的,那么会有一个区别,第一个方法实际上是原子的,而第二个不会,第一个方法实际上会触发getter中的任何复杂逻辑,而第二个方法不会

最简单地说,编译器会将第一个调用重新写入:

[[self name] aMethod]

而第二个调用只是保持原样。

通过getter的第一个调用——它等于
[[self name]aMethod]
。第二种只是使用直接访问

一般来说,您应该倾向于使用访问器,但有时您应该偏离这一点。最常见的情况是在部分构造状态下,例如初始值设定项和
dealloc
。原因是您应该小心地构造或销毁您的状态,而不要对对象的接口语义感兴趣——也就是说,使用访问器可能会产生负面的行为和语义副作用

可以在此处找到更完整的原因列表:

[[self name] aMethod]