【问题标题】:Dealloc on my custom objective-CDealloc 在我的自定义目标 C 上
【发布时间】:2010-06-05 16:37:05
【问题描述】:

我正在开发一个 iPhone 应用程序,而且我对 iPhone 开发非常陌生。

我创建了一些带有实例变量(NSArray、NSString 等)的自定义类。所有类都继承自 NSObject。

我应该创建一个dealloc方法来释放所有实例变量吗?

谢谢。

【问题讨论】:

  • 这是一个通用问题。我正在创建像 NSArray 和 NSString 这样的对象,我想我必须解除分配它们。但是我看到了一些示例代码,其中这些实例变量没有被释放。

标签: iphone objective-c oop


【解决方案1】:

是的,如果您保留作为对象的实例变量,您肯定需要一个 dealloc。您可能还需要保留或复制它们,具体取决于您的对象如何创建/使用它们。

查看this article 的内存管理。我认为它很好地解释了它。您还必须阅读Memory Management Programming Guide for Cocoa。即使您没有完全理解所有内容,也请通读全文,然后阅读文章,然后做一些工作,遇到一些崩溃并再次阅读:) 最终应该全部点击。

【讨论】:

  • 不是,不是。 '保留作为对象的实例变量'并没有说明你有一个 dealloc 方法。
  • @mustISignUp:除非它们被简单地分配或全部为单例,否则你会的。而且由于对象作为实例变量应该被分配(例如委托)和对单例的引用是罕见的情况,那么是的,您将必须有一个 dealloc 方法。我的措辞可能有点太强了,但是初学者应该养成编写适当的拆卸方法的习惯。
  • 这是误导。听起来 dealloc 方法很特别 - 它不是。
  • @mustISignUp:它很特别,它是 Cocoa 的析构函数,它是 Cocoa 中托管内存的基本组成部分。即使您不保留任何对象 ivars 的所有权,在 dealloc 中简单地将它们分配为 nil 仍然是一种好习惯,因为您已经清楚地考虑了内存影响。他在托管内存环境中使用 Cocoa,所以虽然他 / 可以 / 做非标准的事情,但他的问题的答案肯定是肯定的。
  • 我的意思是你似乎在误导@VansFannelAre,dealloc 的特殊之处在于这是 Cocoa 中的一种方法,它是你必须拥有的规则。就像没有重写 dealloc 方法的 NSObject 的子类一样,不应该真正编译 - 只有那些 Apple 窥视者不知道如何正确编写编译器。这可能有助于@VansFannel 了解实际发生的情况。
【解决方案2】:

在 iPhone 开发中,由于没有垃圾收集,因此几乎是 SOP 有一个 dealloc。

【讨论】:

    【解决方案3】:

    你必须释放你的类拥有的任何对象。这意味着,是的,您必须覆盖 dealloc 方法并在那里释放对象。

    通常您对实例变量中的值(对象)拥有所有权,但这也取决于您自己如何创建它们。

    您绝对应该阅读Memory Management Programming Guide,当您获得所有权时,它的描述非常好。

    【讨论】:

    • 你不必释放和反对你的类拥有所有权(这甚至没有任何意义。)。如果你想释放一个对象,你当然不必通过覆盖(原文如此)dealloc来做到这一点。
    • @mustISignUp:你说得对,我的措辞不好。当然,您可以随时释放对象。但是我仍然认为,如果您拥有所有权,则必须释放它,这意味着您保留了该对象(因此增加了保留计数)。除了垃圾收集(iPhone 上不存在),否则保留计数会如何减少?
    【解决方案4】:

    是的,使用 dealloc 方法通常是最好的方法。

    如果您想回收实例变量使用的内存,您必须在使用完它们后释放它们。您可以添加一个方法来进行清理:-

    - (void)cleanUp {
      [myArray release];
      [myString release];
    }
    

    当您不再需要实例时调用它。

    现在,您想要释放这些变量的时间点很可能是它们的父对象被销毁的时间点(父对象已经消失,因此不再需要实例变量)。当父对象要被销毁时,-dealloc 会自动为您调用 - 将清理代码放在 dealloc 中比在我们必须在正确时间调用的 -cleanup 方法中更有意义。

    如果您不想重复使用内存,例如。如果您永远将完成实例变量,那么您不需要释放它们并且可能不需要-dealloc。

    【讨论】:

    • .. 并且您希望将这些实例变量设置为 nil,否则您将在调用真正的 dealloc 时双重释放它们。
    • errrrrrr,这更像是一个不该做的例子!
    猜你喜欢
    • 2011-11-09
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2011-07-27
    相关资源
    最近更新 更多