代码之家  ›  专栏  ›  技术社区  ›  TheLearner

释放和释放消息的顺序

  •  1
  • TheLearner  · 技术社区  · 14 年前

    推荐的方法是什么?我应该先打电话给Super DealLoc还是最后打电话给Super DealLoc?

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

    另外,当涉及到像didViewLoad这样的重写方法时,我应该首先调用super还是最后调用super?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Eiko    14 年前

    总是呼叫 [super dealloc] 最后的 或者你很容易遇到麻烦,因为你正在处理一个陈旧的对象。

    使用didViewLoad,您通常在自己的代码之前调用它,因为您希望之前执行标准的初始化工作。不过,我在苹果的代码中看到过一些根本不称之为超级实现的例子,所以也许根本就没有什么进展。

        2
  •  2
  •   DerekH    14 年前

    在这种情况下,释放所有属性/ivar后,请致电super。对于viewdidload/willappear/etc,我通常首先调用super。当您的自定义类依赖于一个由super创建的对象时,顺序很重要。对于默认的viewdidload,情况并非如此,所以它是首选项(我相信)。

        3
  •  0
  •   hooleyhoop    14 年前

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

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

    我们知道[super dealloc]完全破坏了当前对象,所以在它之后出现的任何代码都是错误的。因此,在这种情况下,请最后致电[超级DealLoc]。

        4
  •  0
  •   Alex Brown    14 年前

    指针 orderNumber orderDate 被固定在你的物体内。

    [super dealloc] 解除分配对象(aka self )

    一旦解除分配对象,就不能依赖对象内部的内容(例如ordernumber),因为它们在解除分配对象之前就具有相应的值。

    因此,在取消自对象的分配之前,请取消分配成员。


    反之亦然 init 函数-您不能初始化指针,直到 之后 你的物体是被构造的,所以 [super init] 在初始化成员之前。

        5
  •  0
  •   grahamparks    14 年前

    关于 viewDidLoad (等),你做任何工作。如果在超类做它的事情之前你有你想要发生的事情,那么在你调用超类方法之前你就做了,同样的,对于以后你想要发生的事情也是这样。

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