Objective-C类没有属性?

时间:2011-04-06 19:25:51

标签: objective-c properties instance-variables

我正在查看大型项目中的一些代码,我注意到在几个类中,创建了实例变量但没有创建相应的属性(@property)。

创建没有属性的实例变量是“错误的”吗?这不会成为内存管理问题吗?

我以前从未见过这样的代码所以我不确定此时要考虑什么。

提前致谢!

4 个答案:

答案 0 :(得分:1)

没有理由你必须使用Objective-C 2样式的setter / getter来管理你的实例变量 - 只要在dealloc方法中释放实例变量(如果它确实是一个分配/引入的对象,等等)。 )那就没什么可担心的了。

请记住,在Objective-C之前,这些属性(以及整个@property / @synthesize语法)根本就不存在,所以如果你不得不创建自己的getter / setter认为有必要/方便。

答案 1 :(得分:1)

完全没有。实例变量工作正常,并且与其他任何内容管理规则相同:在将其保存到实例var之前保留它,并确保在不再需要它时释放它(通常在{{1}中})。

这里的一些历史可能会有所帮助:

一开始,只有实例变量。按照惯例,“属性”仅以非正式方式存在,用于类外的对象访问类暴露的“公共”数据。您可以为每个方法编写自己的dealloc-(Foo *)foo方法。那些通常就像样板代码,在第一种情况下平凡地返回ivar,并在后者中做正确的保留/释放/设置舞蹈。

所以Objective-C 2.0出现并让我们能够用语言语法声明属性,甚至为我们生成访问器 - 节省了大量的时间和样板代码。

随着时间的推移,一些人开始将所有伊娃作为“财产”,公共或私人。公共文件在.h文件中显示为-(void)setFoo:(Foo *)f,但您也可以在.m文件中创建一个私有接口,声明您的“私有”@properties,这样您就可以使用访问者在你的班级里面。根据你对它的理解,这可能是也可能不是过度杀伤,但我认为这与你现在看到的情况有关,裸体伊娃会看起来很可疑。

他们不应该。实例变量幸福地存在而没有任何其他机制。只需保留/释放权限(在非GC运行时)。

随着你越来越高级,请参阅@ bbum对这个问题的回答: Must every ivar be a property? 对于一些更多大学的事情来考虑围绕KVO和子类化的属性的好处。

答案 2 :(得分:1)

@properties只是速记 - 非常方便的简写 - 你可以自己写的代码,没有任何魔力。

也可能是@properties在类扩展中的实现文件中声明,并且没有可公开访问的API来直接操作实例变量。

答案 3 :(得分:0)

实例变量的属性不是必需的。实际上,在Objective-C的v2.0之前,没有属性这样的东西 - 你必须为实例变量编写自己的访问器和mutator(如果你想在类之外访问它们)。属性可以简化内存管理,但说实话,ivars的内存管理并不困难,而且处理起来也不难。