我在使用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,否则会导致强大的参考周期。这是我应该使用它的另一个地方吗?
答案 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>