iVar未使用ARC解除分配

时间:2012-09-29 18:33:36

标签: ios cocoa-touch cocoa memory-management automatic-ref-counting

我在使用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];
}

我的期望是,tempScrollView一旦从superview中删除,就会被解除分配,但事实并非如此。据推测,因为iVar还在引用它吗?

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

1 个答案:

答案 0 :(得分:1)

添加/删除滚动视图是ivar内存管理的一个独立问题。你所得到的是正确的,除非你在使用tempScrollView时确实将ivar设置为nil。

当您将视图B(滚动视图)添加为视图A(self.view)的子视图时,视图A保持对(即保留)视图B的强引用。当您将视图B作为子视图删除时,查看A删除它对(即发布)视图B的强引用。然而,ivar tempScrollView很强大,因此视图控制器(self)保持对scrollview的强引用,正如您所见,它不是释放。删除该强引用的方法是将ivar设置为nil。

我补充说,在我看来,你应该使用@property来实现tempScrollView而不是直接使用ivar。使用ARC并不是一个问题,但一般来说,将内存管理封装在属性访问器中会更好,而且此时代码行数相同。 / p>