Objective c 使用实例变量或getter方法时的iOS
我有一个关于使用getter和实例变量的问题。让我们看一个例子 假设在.h文件中有: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并将消息发送到其结果
@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]