gpt4 book ai didi

ios - UIViewControllers 和 ARC

转载 作者:行者123 更新时间:2023-11-28 20:26:20 25 4
gpt4 key购买 nike

因此,经过深思熟虑和花时间尝试搜索内存管理问题的挫败感后,我进行了一些研究,最终屈服于改用 ARC。而且它相对无痛。然而,我的 UIViewControllers 出现了一个新问题,Pre-arc 它们都像宣传的那样工作,我将它们插入堆栈,它们出现了,我将它们从堆栈中弹出,它们的 dealloc 方法被调用,每个人都很高兴。切换到 ARC,永远不会调用 dealloc。这是不幸的。所以我对这个问题做了一些研究,让我列出我正在做什么和/或没有做什么

。首先,我插入堆栈的 View 未明确声明为强 View 。

.子类对父类的委托(delegate)是 unsafe_unretained,但为了覆盖基础,我什至注释掉了将委托(delegate)设置给父类,这并不令人高兴。

。关闭 NSzombies,因为这显然会导致在启用 ARC 的代码中留下东西

.根据 brad larsons 在 Memory not released in ios view hierarchy 中的回答,我更改了我的代码, 从这个

if (_friendsListVC == nil) 
{
_friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
_friendsListVC.delegate = self;
}

[self.navigationController pushViewController:_friendsListVC animated:YES];

(_friendsListVC 是一个成员变量)。为此

 FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
//fVC.delegate = self;
[self.navigationController pushViewController:fVC animated:YES];

再一次没有喜悦,dealloc 断点永远不会被击中,问题是我在我的应用程序中推送和弹出了很多 View ,所以这只会导致更多的内存问题,在我切换到 ARC 的问题之上希望修复...

另请注意,我在此 View 中有一些代码块以及其他一些代码块,但我不使用 self,我也读到它是 self 保留的,因此当涉及到代码块时,您应该使用弱引用。

我很困惑,谁能给我解释一下 ARC 在做什么?或者我为了使用 ARC 而没有做什么?为了将来引用,您想要推送到 ARC 中的 View 层次结构的所有 View 都不应是实例变量吗?

提前致谢。

最佳答案

我弄清楚了问题所在,但它并没有修复没有被释放的其他 Controller ,这些 Controller 完全出于不同的原因。因此,为了传播知识并减轻其他人的这种痛苦,我将列出可能导致保留周期的事情的数量,主要与 ARC 和 UIViewControllers 以及代码块有关

  1. 对您所插入的观点没有强烈的引用。

  2. 如果您推送到 View 层次结构的类具有调用 push 方法的类的委托(delegate),则将其设为 unsafe_unretained 引用,实际上,将所有委托(delegate)设为 unsafe_unretained 作为我的委托(delegate)之一是一种很好的做法非常强大,因为我认为 ARC 转换器会为我做到这一点。

  3. 关闭 NSZombies。不是永久地介意你,只是为了当你需要确保 dealloc 语句在它们应该被调用的时候被调用。

  4. 不要在代码块中直接引用 self,这会导致保留循环。如果需要使用self,在block外进行如下操作(然后使用weakself)

    __unretained_unsafe className *weakSelf = self;

  5. 当心静态引用,我不确定这一点,但我有一个方法接受两个实例化的 View Controller 并将一个放在另一个之上,引用被分配给它们的两个静态实例类(不要问为什么),在使用它们后将它们归零后似乎解决了我的问题,我不确定为什么。

  6. 这是另一个我不确定但曾在某处提到过一两次,如果类中有代码块,尽量不要在该 block 中使用实例变量,再次使变量 __unsafe_unretained。

就是这样,在检查了其中的大部分并修复它们之后,我的所有 View 在每次推送时都会调用它们的 dealloc 方法,而不是在某个奇怪的任意点调用。另外要澄清的是,这只是一个简短的 list ,可以快速帮助面临同样问题的任何人,我并没有声称对这里的一些概念有完全的理解,但我建议你应该这样做,因为我希望及时。

关于ios - UIViewControllers 和 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796006/

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