0

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

@interface RecipeBrowserViewController ()
{
    UIScrollView *tempScrollView;
}

这是必要的,因为在执行期间我有时需要UIScrollViewUIScrollView

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

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

tempScrollView = nil从清除它后添加它superview,但我不确定正确的方法是什么。我应该改为声明weakiVar 吗?到目前为止,我只看到weak了针对代表或其他双向 iVar 的建议,否则会导致强大的参考周期。这是我应该使用它的另一个地方吗?

4

1 回答 1

1

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

当您将视图 B(滚动视图)添加为视图 A(self.view)的子视图时,视图 A 会保持对视图 B 的强引用(即保留)。当您将视图 B 作为子视图移除时,视图 A 会移除其强引用对(即发布)视图 B 的引用。但是,ivar tempScrollView 很强大,因此视图控制器(自身)保持对滚动视图的强引用,正如您所见,它没有被释放。删除该强引用的方法是将 ivar 设置为 nil。

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

于 2012-09-29T18:37:05.680 回答