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

时间:2012-02-05 21:24:52

标签: objective-c ios properties accessor

我对使用getter和实例变量有疑问。我们来看一个例子。

假设我有一个.h文件:

@property (nonatomic,strong) NSString *name

并在.m文件中我以这种方式合成该变量:

@synthesize name = _name;

现在我的问题是:使用之间的区别是什么:

[self.name aMethod]

[_name aMethod]

谢谢!

3 个答案:

答案 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?