目标C - 使用访问器,如果没有任何不同

时间:2009-08-18 05:41:56

标签: objective-c properties accessor

在目标c中,如果使用getter并直接访问ivar做同样的事情,getter中没有延迟加载代码,它所做的只是返回ivar,你还会使用访问器还是直接访问ivar既然没有区别?为什么呢?

编辑:我在课堂上谈论。

3 个答案:

答案 0 :(得分:6)

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

然而,优势并不多,有些人可能认为这是不成熟的优化。使用属性(或方法)的内容将使您能够在以后进化类并更改ivar但同时保持属性相同(例如,使其成为计算属性)。它还允许子类覆盖您的属性并仍然有效。

(顺便说一句,在某些情况下,引用属性语法可能会有所帮助,例如在写入ivar时。在这种情况下,复制|保留的属性支持可以帮助释放前一个对象并获得正确的保留/释放呼叫序列)

答案 1 :(得分:0)

你是在谈论课外还是在课堂内?如果没有,那么你总是使用访问者。首先,ObjC中ivars的默认可见性为@protected,因此,除非您明确指定@public,否则 使用访问者。除此之外,您使用访问器是因为您永远不知道您(或其他人)是否可以将您的类子类化并更改它以使用访问器是必要的。

如果你在课堂上谈论,你不 使用访问者,但如果你设置了@property值,就没有理由不使用这个点符号,即使你正在综合所有东西。如果您使用的是标准的ObjC表示法,例如[myObject someVariable],那么重复的嵌套邮件就会变得难以阅读和混乱。

实际上,访问器并不像mutator那样大,因为mutators通常不止一件事。使用两个getter(课外)和setter是很好的做法。

答案 2 :(得分:0)

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