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

@interface RecipeBrowserViewController ()
{
    UIScrollView *tempScrollView;
}


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

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


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

tempScrollView = nil删除后添加superview可以清除此问题,但是我不确定哪种方法正确。我应该声明一个weak iVar吗?到目前为止,我只看到为代表或其他双向iVar建议的weak,否则将导致强大的参考周期。这是我应该使用的另一个地方吗?

最佳答案

添加/删除滚动视图是独立于ivar内存管理的问题。您所拥有的是正确的,除了在使用tempScrollView完成操作后,确实应该将ivar设置为nil。

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

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

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

10-12 14:49