【问题标题】:Order of release and dealloc messages释放和释放消息的顺序
【发布时间】:2010-11-17 15:44:34
【问题描述】:

推荐的方法是什么。我应该先调用还是最后调用 super dealloc 还是没关系?

- (void)dealloc
{
    [super dealloc];
    [orderNumber release];
    [orderDate release];
}

当涉及到像 didViewLoad 这样的覆盖方法时——我应该先调用 super 还是最后调用?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    总是打电话给[super dealloc]last,否则你很容易因为你正在处理一个陈旧的对象而遇到麻烦。

    使用 didViewLoad,您通常会在您自己的代码之前调用它,因为您希望之前执行标准初始化内容。不过,我在 Apple 的代码中看到了根本不调用 super 实现的示例,所以也许无论如何都没有发生太多事情。

    【讨论】:

      【解决方案2】:

      在这种情况下,在您释放所有属性/iVar 后调用 super。对于 viewDidLoad/willAppear/等。我通常先打电话给super。当您的自定义类依赖于由超级创建的对象时,顺序很重要。对于默认的 viewDidLoad,情况并非如此,所以它是首选(我相信)。

      【讨论】:

      • 这个想法是先做你自己的子类的拆卸,然后让 super 做它的事情,然后它的 super,等等。这是典型的 -init 过程的相反顺序,在该过程中,您首先调用 super 的 -init(以设置其内容),然后是您自己的内容。
      【解决方案3】:

      没有一般规则 - 您选择覆盖该方法,它有什么作用?您希望它在您的自定义实现之前还是之后发生?

      • didViewLoad 似乎不是真正的方法。

      我们知道 [super dealloc] 完全破坏了当前对象,所以任何在它之后的代码都是错误的。所以,在这种情况下,最后调用 [super dealloc]。

      【讨论】:

        【解决方案4】:

        指针orderNumberorderDate 保存在您的对象中。

        [super dealloc] 释放您的对象(又名self)。

        一旦你释放了你的对象,你就不能依赖它里面的东西(例如 orderNumber)在你释放它之前拥有它们所做的值。

        因此,在释放 self 对象之前释放成员。


        init 函数的情况正好相反 - 在构造对象之后 之前,您无法初始化指针,因此 [super init] 在初始化成员之前出现。

        【讨论】:

          【解决方案5】:

          关于viewDidLoad(等),你可以做任何有效的事情。如果你想在超类做它的事情之前发生一些事情,那么你在调用超类方法之前做它,同样对于你想要在之后发生的事情。

          如果您不知道您的代码应该在之前还是之后运行,那么这可能并不重要。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-02
            • 2011-11-09
            • 2012-08-22
            • 2011-08-26
            相关资源
            最近更新 更多