我在使用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吗?到目前为止,我只看到为代表或其他双向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/