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

6
我是一位有用的助手,可以为您进行翻译。以下是需要翻译的内容:

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

假设我在一个.h文件中有:

@property (nonatomic,strong) NSString *name

在 .m 文件中,我通过以下方式合成该变量:

@synthesize name = _name;

现在我的问题是:使用以下哪种方式有什么区别:
[self.name aMethod]

并且

[_name aMethod]

谢谢!

3个回答

8
第一种方法通过getter方法访问ivar。第二种方法直接访问ivar。由于它是一个简单的合成属性,除了第一种方法会多调用一个方法之外,没有太大的区别。但是,如果这个属性是原子性的、动态的,或者getter方法很复杂,那么第一种方法和第二种方法之间就会有所不同:第一种方法实际上是原子性的,而第二种方法则不是;第一种方法实际上会触发getter中的任何复杂逻辑,而第二种方法则不会。
简单来说,编译器将第一个调用重写为:
[[self name] aMethod]

第二次调用仅按原样保留。


1
[self.name aMethod]

等同于

[[self name] aMethod]

因此,调用getter并将消息发送到其结果。

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

然而,如果getter不是平凡的(即合成的),情况可能并非如此。


0

第一个调用getter方法--等同于[[self name] aMethod]。第二个直接访问。

通常情况下,您应该优先使用访问器,但有时候您应该偏离这一点。最常见的情况是在部分构造状态下,例如初始化程序和dealloc。原因是您应该仔细构造或销毁状态,而不是关注对象的接口语义 - 也就是说,使用访问器可能会产生负面行为和语义副作用。

更完整的原因列表可以在此处找到: 为什么要使用实例变量?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接