gpt4 book ai didi

ios - 释放调用顺序

转载 作者:行者123 更新时间:2023-12-03 16:54:45 26 4
gpt4 key购买 nike

我有自定义的 View 层次结构。每个 View 都保留其 subview 。除了 parent 之外,没有其他人保留 View 。当 View 的dealloc被调用时,它会调用[childrenrelease]。当我想销毁 View 并删除相关资源时,我打电话:

[mainView release];
[resourceManager deleteRelatedResources];

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

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

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

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

我找到了recommendation from Apple不要依赖 dealloc 的资源管理调用。是否可以在[ child 释放]之后立即调用 child View 的dealloc?有什么解决方法吗? (我的项目已经走得太远,无法更改资源管理方案)。

最佳答案

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

当然,有一些解决方法可以让您竭尽全力尝试保证订单。但没有任何解决方法是万无一失的,你只会把洞挖得更深。

您唯一可以假设的是,在 A 的 dealloc 中释放的对象将始终在 A 之后被释放。什么时候?你无法确切地知道。

(一个问题是任何对象都可以随时保留/自动释放。)

一个可能的快速修复方法是添加无效模式。也就是说,通过在所有具有依赖资源管理的类中实现一个方法,将资源管理从 dealloc 中移出,您可以在其中控制该方法的调用。

然后你做类似的事情:

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

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

关于ios - 释放调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14587985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com