4

在目标c中,如果使用getter和直接访问ivar做完全相同的事情,getter中没有延迟加载代码,它所做的只是返回ivar,你仍然使用访问器还是直接访问ivar,因为有没有不同?为什么?

编辑:我在课堂上谈论。

4

3 回答 3

6

直接使用 ivar 有一点性能优势。但是,为了避免混淆,我通常在 ivars 前面加上 _ 前缀,然后使用 @synthesize foo = _foo; 合成一个属性。这意味着我可以做 [self foo] 或 _foo。然后它在我所指的代码中变得更加清晰。

然而,优势并不大,有些人可能会认为这是过早的优化。使用该属性(或方法)将为您提供稍后发展您的类并更改 ivar 但同时保持属性相同(例如使其成为计算属性)的能力。它还将允许子类覆盖您的属性并仍然有效。

(顺便说一句,在某些情况下引用属性语法可能会有所帮助,例如在写入 ivar 时。在这种情况下,对 copy|retain 的属性支持有助于释放先前的对象并获取保留/释放调用的正确顺序)

于 2009-08-18T07:28:51.477 回答
1

你说的是课外还是课内?如果没有,那么您总是使用访问器。首先,在 ObjC 中 ivars 的默认可见性是@protected,所以除非你明确地使它们@public,你必须使用访问器。除此之外,您使用访问器是因为您永远不知道您(或其他人)是否可以子类化您的类并对其进行足够的更改以致需要使用访问器。

如果您在课堂上讨论,则不必使用访问器,但如果您设置@property值,则没有理由不使用点符号,即使您正在综合所有内容。如果您使用标准的 ObjC 表示法,例如[myObject someVariable],那么重复的嵌套消息可能会变得难以阅读和混乱。

实际上,访问器并不像 mutator 那样重要,因为 mutator 经常做不止一件事。同时使用 getter(类外)和 setter 是一种很好的做法。

于 2009-08-18T05:49:40.477 回答
0

我决定始终使用 [self ivar],而不是直接使用 ivar,即使我使用标准的 ObjC 括号表示法,而不是点表示法。唯一的例外是,如果 [self ivar] 是一个延迟加载访问器并且我已经在方法中使用了它并且我知道它已经被初始化并且我不想检查它是否在我使用它的 10 次以上时为零方法。

于 2009-08-21T02:46:50.487 回答