我对使用getter和实例变量有疑问。我们来看一个例子。
假设我有一个.h文件:
@property (nonatomic,strong) NSString *name
并在.m文件中我以这种方式合成该变量:
@synthesize name = _name;
现在我的问题是:使用之间的区别是什么:
[self.name aMethod]
和
[_name aMethod]
谢谢!
答案 0 :(得分:8)
第一个通过getter方法访问ivar。第二个直接访问ivar。由于它是一个简单的,合成的属性,除了第一个进行额外的方法调用之外没有太大区别。但是,如果属性是原子的,或者是动态的,或者getter方法很复杂,那么第一个实际上是原子的,而第二个则不是,第一个实际上会触发任何复杂的逻辑。吸气,而第二个不会。
简单来说,编译器会将第一个调用重写为:
[[self name] aMethod]
而第二个电话只是原样保留。
答案 1 :(得分:1)
[self.name aMethod]
相当于
[[self name] aMethod]
因此调用getter并将消息发送到其结果。
在您的情况下,可见结果将是相同的。
然而,如果吸气剂不是微不足道的(即合成的话),情况可能并非如此。
答案 2 :(得分:0)
第一次通过getter调用 - 它等于[[self name] aMethod]
。第二个只使用直接访问。
您通常应该偏好使用访问者,但有时您应该偏离它。最常见的情况是处于部分构造状态,例如初始化程序和dealloc
。原因是你应该仔细构建或破坏你的状态,而不要对你的对象的接口语义感兴趣 - 也就是说,使用访问器可能会产生负面的行为和语义副作用。
可在此处找到更完整的原因列表: Why would you use an ivar?