这三个变量定义有什么区别?

时间:2016-05-29 03:45:00

标签: objective-c

enter image description here

请详细解释,谢谢。

1 个答案:

答案 0 :(得分:0)

在你的三个例子中,_foo1_foo3都是实例变量(ivars)并且在功能上是等价的(尽管有些旧编译器不允许{{1}中的ivars })。我见过人们热情地争论@implementation模式,你的@implementation例子。请参阅有点过时Where to put iVars in "modern" Objective-C?但我更喜欢在私有扩展(您的_foo3模式)中定义我的ivars,以将属性和ivars保持在一起。但是,我会把它留在那里,因为它是个人意见的问题(因此不适合SO)。

第二种模式_foo1是一种属性,是一种完全不同的鱼:关于属性与ivars,Apple建议使用属性而不是ivars。事实上,他们在使用Objective-C编程Encapsulating Data章节中启动您可以定义不带属性的实例变量部分,并提出警告,“它是最好的当你需要跟踪一个值或另一个对象时,练习在对象上使用属性。“

对于理论性能优势,有些人会争论静态属性,但这似乎是对我的过早优化,牺牲代码维护可忽略不计的性能差异。该属性的优点是您可以享受自动内存语义(foo2 vs copy vs strong),并且使用该属性的代码将从属性的任何特殊实现细节中抽象出来,有没有。

如果您正在详细查看解释,我建议您参考前面提到的Programming with Objective-C指南。