我在一个大型项目中查看一些代码的过程中,我注意到在几个类中,创建了实例变量,但没有创建相应的属性(@property)。
创建没有属性的实例变量是"错误的"吗?这不会成为内存管理问题吗?
我从来没有见过这样的代码,所以我不知道在这一点上该怎么想。
提前感谢!
@properties仅仅是您自己编写的代码的简写——非常方便的简写,没有什么神奇的。
也可能@properties是在类扩展的实现文件中声明的,并且没有可公开访问的API来直接操作实例变量。
你没有理由必须使用Objective-C 2风格的setter/getter来管理你的实例变量——只要实例变量在dealloc方法中被释放(如果它确实是一个已分配/已初始化的对象,等等),那么就没有什么可担心的。
请记住,在Objective-C之前,这样的属性(以及整个@property
/@synthesize
语法)根本不存在,所以如果你认为有必要/方便的话,你必须创建自己的getter/setter。
一点也不。实例变量工作得很好,并且受到与其他任何东西相同的内存管理规则的约束:在将其保存到实例变量之前保留它,并确保在不再需要它时释放它(通常在dealloc
中)。
这里的历史可能会有所帮助:
一开始,只有实例变量。按照惯例,"属性"仅以一种非正式的方式存在,用于类外的对象访问类公开的"公共"数据。您可以为每种方法编写自己的-(Foo *)foo
和-(void)setFoo:(Foo *)f
方法。这些代码通常就像样板代码,在第一种情况下简单地返回变量,而在后一种情况下做正确的保留/释放/设置。
所以Objective-C 2.0出现了,给了我们用语言语法声明属性的能力,甚至为我们生成访问器——节省了大量的时间和样本代码。
随着时间的推移,有些人开始认为所有变量都是"属性",无论是公共的还是私有的。公共的在.h文件中显示为@properties
,但是您也可以在.m文件中为您的对象创建一个私有接口,声明您的"私有"@properties
,这样您就可以在类中使用访问器。这可能是,也可能不是,这取决于你的哲学,但我认为这必须在你现在看到的情况下,裸体的ivars看起来很可疑。
他们不应该。实例变量在没有任何其他机制的情况下愉快地存在。只需要让你的retain/release正确(在非gc运行时)。
当你更高级的时候,看看@bbum对这个问题的回答:每个变量都必须是属性吗?关于关于KVO和子类的属性的好处的一些更多样化的事情。
实例变量的属性不是强制性的。事实上,在Objective-C v2.0之前,没有属性这样的东西——你必须为实例变量编写自己的访问器和mutator(如果你想在类之外访问它们)。属性可以简化内存管理,但老实说,ivars的内存管理并不是那么困难,您自己处理也不难。