dealloc呼叫顺序

时间:2013-01-29 16:52:51

标签: ios objective-c cocoa memory-management

我有自定义的视图层次结构。每个视图都保留其子项。 除了父母之外,没有其他人保留观点。 当调用dealloc for view时,它会调用[children release]。 当我想销毁视图并删除相关资源时, 我打电话给:

[mainView release];
[resourceManager deleteRelatedResources];

大部分时间它运作良好,呼叫顺序为:

  1. mainView dealloc;
  2. mainView的孩子们的dealloc;
  3. mainView的孙子的dealloc等。
  4. deleteRelatedResources
  5. 但有时(约1%)我还有另一个订单:

    1. mainView dealloc;
    2. deleteRelatedResources
    3. mainView的孩子们的dealloc;
    4. mainView的孙子的dealloc等;
    5. 我发现recommendation from Apple不依赖于dealloc'调用资源管理。在[儿童释放]之后,儿童的意见可以被称为不正确吗?有没有解决方法? (我的项目太过于无法改变资源管理方案)。

2 个答案:

答案 0 :(得分:4)

dealloc调用的顺序是不确定的;如果您的代码在不同类之间的dealloc实现中具有顺序依赖性,请考虑该代码已损坏。

当然,有一些解决方法,你可以不遗余力地尝试并保证订单。但是没有任何解决办法是防弹,而你只是在深挖这个洞。

你可以假设唯一的事情是在A dealloc中发布的对象将始终在A之后被释放。何时?你无法明确地知道。

(一个问题是任何时候任何对象都可以自由retain/autorelease d。)

一个可能的快速解决方法是添加无效模式。也就是说,通过在依赖资源管理的所有类中实现一个方法来控制所述方法的调用,从而将资源管理从dealloc移出。

然后你做了类似的事情:

[myObject invalidateAllResources]; // traverses object graph, in order, invalidating resources

[myObject release]; // do the normal release-maybe-dealloc dance

答案 1 :(得分:0)

我的猜测是,一些mainView的子视图由于某种原因(动画或其他一些用途)被保留在其他地方,因此它们不会立即被dealloc。

您可以通过检查视图的子项被取消分配时的retainCount来测试它。