【问题标题】:Objective-C class without properties?没有属性的Objective-C类?
【发布时间】:2011-07-31 02:54:39
【问题描述】:

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

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

实际上我以前从未见过这样的代码,所以我现在不知道该怎么想。

提前致谢!

【问题讨论】:

    标签: objective-c properties instance-variables


    【解决方案1】:

    一点也不。实例变量工作正常,并且受制于与其他任何内容相同的内存管理规则:在将其保存到实例 var 之前保留它,并确保在不再需要它时释放它(通常在 dealloc 中) .

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

    一开始,只有实例变量。按照惯例,“属性”仅以非正式的方式存在,以便您的类之外的对象访问该类公开的“公共”数据。您将为其中的每一个编写自己的 -(Foo *)foo-(void)setFoo:(Foo *)f 方法。这些通常就像样板代码,在第一种情况下微不足道地返回 ivar,在后一种情况下做正确的保留/释放/设置舞蹈。

    因此,Objective-C 2.0 应运而生,让我们能够使用语言语法声明属性,甚至为我们生成访问器——节省了大量时间和样板代码。

    随着时间的推移,一些人开始将所有 ivars 视为“财产”,无论是公共的还是私有的。公共接口在 .h 文件中显示为 @properties,但您也可以在 .m 文件中为您的对象创建一个私有接口,声明您的“私有”@properties,因此您可以在类中使用访问器。这可能会也可能不会过大,这取决于你的哲学,但我认为这与你现在看到的情况有关,赤裸的 ivars 看起来很可疑。

    他们不应该。实例变量在没有任何其他机制的情况下愉快地存在。只需正确地保留/释放(在非 GC 运行时)。

    随着您的进步,请参阅@bbum 对此问题的回答: Must every ivar be a property? 围绕 KVO 和子类化的属性的好处来思考更多的大学问题。

    【讨论】:

    • 实际上我注意到在一个特定的类中,.m 文件中甚至没有释放实例变量的 dealloc 方法。
    • @edcincy 如果实例变量未分配或未在其他地方发布,则不一定是问题。
    【解决方案2】:

    没有理由你必须使用 Objective-C 2 风格的 setter/getter 来管理你的实例变量——只要实例变量在 dealloc 方法中被释放(如果它确实是一个分配/初始化的对象等)。 ) 那么就没有什么好担心的了。

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

    【讨论】:

      【解决方案3】:

      实例变量的属性不是强制性的。事实上,在 Objective-C v2.0 之前,没有属性之类的东西——你必须为实例变量编写自己的访问器和修改器(如果你想在类之外访问它们)。属性可以简化内存管理,但说实话,ivars的内存管理并没有那么难,自己处理也不难。

      【讨论】:

        【解决方案4】:

        @properties 只是简写——非常方便的简写——你可以自己编写代码,没有什么魔力。

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

        【讨论】:

          猜你喜欢
          • 2012-01-11
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-06
          • 2011-12-24
          • 1970-01-01
          相关资源
          最近更新 更多