gpt4 book ai didi

ios - iVar 未使用 ARC 释放

转载 作者:行者123 更新时间:2023-11-29 04:23:37 25 4
gpt4 key购买 nike

我在使用 ARC 的类的实现文件中声明了一个 UIScrollView 为 iVar:

@interface RecipeBrowserViewController ()
{
UIScrollView *tempScrollView;
}

这是必要的,因为在执行过程中,我有时需要将 UIScrollView 添加到我的 View 中,有时需要删除相同的 UIScrollView:

if (someTest) 
{
tempScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
tempScrollView.delegate = self;
[self.view addSubview: tempScrollView];
}
else
{
[tempScrollView removeFromSuperview];
}

我的预期是,一旦从 superview 中删除 tempScrollView 就会被释放,但事实并非如此。大概是因为 iVar 仍在引用它?

superview 中删除 tempScrollView = nil 后添加它可以清除此问题,但我不确定正确的方法是什么。我应该声明一个 weak iVar 吗?到目前为止,我只看到为委托(delegate)或其他双向 iVar 建议的 weak,否则会导致强引用循环。这是我应该使用它的另一个地方吗?

最佳答案

添加/删除 ScrollView 是与 ivar 内存管理不同的问题。你所得到的是正确的,除了当你完成 tempScrollView 时你确实应该将 ivar 设置为 nil 。

当您将 View B( ScrollView )添加为 View A (self.view) 的 subview 时, View A 会保留对 View B 的强引用(即保留)。当您将 View B 作为 subview 删除时, View A 会保留对 View B 的强引用(即保留)。删除其对(即释放) View B 的强引用。但是,ivar tempScrollView 很强,因此 View Controller (自身)维护对 ScrollView 的强引用,并且如您所见,它不会被释放。删除强引用的方法是将 ivar 设置为 nil。

我想补充一点,在我看来,您应该对 tempScrollView 使用 @property,而不是直接使用 ivar。对于 ARC,这不是一个大问题,但一般来说,最好将内存管理封装在属性访问器中,并且此时的代码行数相同。

关于ios - iVar 未使用 ARC 释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655372/

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