何时使用实例variables以及何时使用属性

当使用Objective-C属性时,你可以完全停止创build实例variables,或者显式的实例variables(不是由属性合成的variables)仍然可以用于属性不合适的目的。

你可以停止创build实例variables吗?

不,你不能(从某种意义上说)。 你可以做的是停止宣布他们,如果你有属性。 如果你合成一个属性,而你还没有声明instvar,它将会为你声明,所以你正在创build一个实例variables,只是不明确。

他们仍然是为了物业不适合的目的吗?

它曾经是为所有事情创build属性的build议,因为综合属性几乎可以完成所有的保留和释放。 但是,使用属性来包装内存pipe理的理由已经消失。 现在的build议(对于ARC)是我相信,使用属性来声明您的外部接口,但使用直接的实例variables,其中variables是对象的内部状态的一部分。

这是采用ARC的一个很好的理由:属性只是作为类API的一部分才能恢复到真正的目的,不再需要将它们用作隐藏内存pipe理工作的方法。

编辑

还有一件事:现在可以在@implementation声明实例variables,所以现在不需要在@interface泄漏任何实现细节。 即

 @implementation MyClass { NSString* myString; } // method definitions @end 

而且我很确定它也可以在类别中使用。 – 见下面的评论

我build议将所有内容都声明为属性,并完全避免使用手动ivars。 手动创buildivars没有真正的好处。 在头文件@interface声明公共属性,在.m文件中的私有类扩展中声明私有属性。

对JeremyP的一些观点来说,即使内存pipe理不再是一个重要的问题,内存使用访问器在ARC下依然具有重要的价值。 它确保KVO正常工作,更好的子类,支持自定义设置器(特别是对于NSTimer ),支持自定义获取器(例如用于惰性实例化)等。极其容易出错的是具有访问器和ivars的混合。 很容易忘记你需要以哪种方式访问​​。 一致性是好的ObjC的标志。

如果因为某种原因你绝对必须申报伊娃,那么你应该像JeremyP所说的那样,在@implementation块中这样做。


更新(2013年10月):

苹果的指导 (从Objective-C编程:封装数据):

大多数属性都由实例variables支持

一般来说,即使你在自己的实现中访问一个对象的属性,你也应该使用访问器方法或点语法来访问属性,在这种情况下,你应该使用self

这个规则的例外是编写初始化,取消分配或自定义存取方法,如本节后面所述。

这个问题在这之前已经解决了

当你使用synthesize的实例variables被处理并为你实例化。 如果您在使用新版本的XCode时使用Lion,还可以查看转换为ARC时 ARC 中的各种属性

你总是可以从外面访问属性。 所以如果你只想从一个类中读取一个variables,你仍然需要声明一个iVar。 使用object->ivar访问公共ivar比使用方法调用要快一些。