Bes*_*esi 5 cocoa objective-c instance-variables ios
使用Objective-C属性时,您是否可以完全停止创建实例变量,或者显式实例变量(不是由属性合成的变量)仍然用于属性不合适的目的?
Jer*_*myP 13
你能完全停止创建实例变量吗?
不,你不能(在某种意义上).如果你有属性,你可以做的就是停止声明它们.如果您合成了一个属性但尚未声明instvar,那么它将为您声明,因此您创建的是一个实例变量,而不是显式的.
他们仍然服务于财产不合适的目的吗?
它曾经是为所有东西创建属性的建议,因为合成属性可以为您完成几乎所有的保留和释放.但是,使用ARC,使用属性来包装内存管理的原因已经消失.我相信,现在(对于ARC)的建议使用属性来声明外部接口,但使用直接实例变量,其中变量是对象内部状态的一部分.
这是采用ARC的一个很好的理由:属性恢复到它们的真正目的只是作为类的API的一部分,并且不再需要将它们用作隐藏内存管理工作的hacky方式.
编辑
还有一件事:您现在可以在实例中声明实例变量,@implementation因此现在无需泄漏任何实现细节@interface.即
@implementation MyClass
{
NSString* myString;
}
// method definitions
@end
Run Code Online (Sandbox Code Playgroud)
而且我很确定它也适用于类别. - 见下面的评论
我建议将所有内容声明为属性并完全避免使用手动ivars.手动创建ivars没有真正的好处.在标头中声明公共属性,@interface在.m文件的私有类扩展中声明私有属性.
对于JeremyP的一些观点,即使内存管理不再是一个重要问题,内部使用访问器仍然具有ARC的重要价值.它确保KVO正常工作,更好的子类,支持自定义setter(特别是对于类似的东西NSTimer),支持自定义getter(例如延迟实例化)等等.混合使用者和ivars非常容易出错.忘记你需要以哪种方式访问它太容易了.一致性是良好ObjC的标志.
如果你出于某种原因绝对必须申报一个ivar,那么你应该@implementation像JeremyP所说的那样在街区内进行.
更新(2013年10月):
Apple的指导(来自使用Objective-C编程:封装数据):
大多数属性由实例变量支持
通常,即使您从其自己的实现中访问对象的属性,也应该使用访问器方法或点语法进行属性访问,在这种情况下,您应该使用
self:...
此规则的例外是在编写初始化,释放或自定义访问器方法时,如本节后面所述.