1

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

[mainView release];
[resourceManager deleteRelatedResources];

大多数时候它运行良好,调用顺序是:

  1. 主视图释放;
  2. mainView 的孩子的 dealloc;
  3. mainView 的孙子的 dealloc 等。
  4. 删除相关资源

但有时(大约 1% 的时间)我有另一个订单:

  1. 主视图释放;
  2. 删除相关资源
  3. mainView 的孩子的 dealloc;
  4. mainView 的孙子的 dealloc 等;

我发现Apple 建议不要依赖 dealloc 的资源管理要求。是不是在[儿童释放]之后不能立即调用儿童观点的dealloc?有什么解决方法吗?(我的项目更改资源管理方案太过分了)。

4

2 回答 2

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
于 2013-01-29T17:26:38.327 回答
0

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

您可以通过在视图的子视图被释放时检查它的 retainCount 来测试它。

于 2013-01-29T18:50:20.020 回答