请详细解释,谢谢。
答案 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指南。