我有一个在使用ARC的类的实现文件中声明为iVar的UIScrollView:
@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还在引用它吧?
在从superview中删除tempScrollView = nil之后添加它可以解决这个问题,但我不确定正确的方法是什么。我是不是应该声明一个weak iVar?到目前为止,我只看到为委托或其他双向iVars建议的weak,否则将导致强大的引用循环。这是我应该使用它的另一个地方吗?
发布于 2012-09-30 02:37:06
添加/删除滚动视图是一个独立于ivar内存管理的问题。你得到的是正确的,除了当你用完tempScrollView时,你确实应该把ivar设置为零。
当你将视图B (滚动视图)添加为视图A (self.view)的子视图时,视图A会保留对视图B的强引用(即保留)。当你移除视图B作为子视图时,视图A会移除其对视图B的强引用(即释放)。然而,ivar tempScrollView是强的,所以视图控制器(self)保持了对滚动视图的强引用,正如您所看到的,它并没有被释放。删除强引用的方法是将ivar设置为nil。
我补充说,在我看来,你应该为tempScrollView使用@属性,而不是直接使用ivar。对于ARC来说,这不是什么大问题,但一般来说,最好将内存管理封装在属性访问器中,并且此时的代码行数是相同的。
https://stackoverflow.com/questions/12655372
复制相似问题