【问题标题】:Call Release in class or subclass?在类或子类中调用 Release?
【发布时间】:2009-06-23 05:36:10
【问题描述】:

我的基类具有子类使用的属性。应该在哪里调用 Release?在原来的基类还是继承它的类?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    我会说每个类都管理它自己的属性。所以子类应该释放它的属性,而基类应该释放它自己的。

    一旦子类被释放,它将无法访问基类属性,从技术上讲,它不再存在。标准的dealloc写法是:

    - (void)dealloc
    {
       // release my stuff, after this line
       // I don't exist and do not need to access any of my properties
       [super dealloc];
    }
    

    【讨论】:

    • 同意。无论语言如何,这始终是我在 OO 编程中的规则。属性是基于所有权的,就像 Objective-C 内存管理一样——两者几乎总是相同的,因为属性本​​质上是访问实例变量的好方法。始终在声明它们的类中释放 ivars,而不是在其任何子类中(如果有的话)。它本质上是匹配保留和释放调用的相同模式。
    【解决方案2】:

    如果属性只被子类使用,它们应该在子类(而不是父类)中定义,并且子类应该在它的 -(void)dealloc 函数中释放它们。你会有这样的东西:

    - (void)dealloc
    {
       [username release];
       [password release];
       [super dealloc];
    }
    

    请注意,我们不会在属性上调用 dealloc!我们只是称之为“释放”,这意味着我们将不再使用它们并且系统可以清理它们(前提是没有其他人在使用它们)。

    【讨论】:

      【解决方案3】:

      我对 Objective-C 很陌生,所以我也很好奇这里的最佳答案是什么。我认为您应该在父类-dealloc 中将属性设置为nil,该属性是在其中合成的。如果你出于某种原因将它保留在子类中,你也应该在子类中释放它,但在超类中将属性设置为 nil 不应该有任何负面影响。

      【讨论】:

      • Apple 文件表明您不应在 init/dealloc 中使用属性设置器,因此您不应将属性设置为 nil,而应简单地调用 [ivar release]。如果您还需要将 ivar 设置为 nil,那么您做错了应该纠正的事情(例如删除计时器/观察/延迟方法调用)。
      【解决方案4】:

      在给定的块中,retain、copy、alloc 的调用次数应与 release、autorelease 的调用相平衡。 如果你在子类中保留一些东西,在子类中释放它,如果在基类中......

      我是从一篇关于逐步的文章中凭记忆解释的。

      【讨论】:

      • 永远不要解释内存管理规则。只需直接引用它们:developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…>。规则只有十几句话,不需要转述。
      【解决方案5】:

      简答:在基类中。

      长答案:对象由其他对象“拥有”。要拥有一个对象,您必须分配或保留它(使用保留、分配、新建或复制)。所有者负责通过释放或自动释放来处理内存。每个分配/保留都应该有一个释放/自动释放。

      Cocoa 约定只有以“new”和“copy”开头的方法返回已分配/复制/保留但不属于方法接收者的对象。所有者就是调用“新建”或“复制”函数的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-05
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多