首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用ARC释放iVar

不使用ARC释放iVar
EN

Stack Overflow用户
提问于 2012-09-30 02:33:36
回答 1查看 328关注 0票数 0

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

代码语言:javascript
复制
@interface RecipeBrowserViewController ()
{
    UIScrollView *tempScrollView;
}

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

代码语言:javascript
复制
if (someTest) 
{
    tempScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    tempScrollView.delegate = self;
    [self.view addSubview: tempScrollView];
}
else 
{       
    [tempScrollView removeFromSuperview];
}

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

在从superview中删除tempScrollView = nil之后添加它可以解决这个问题,但我不确定正确的方法是什么。我是不是应该声明一个weak iVar?到目前为止,我只看到为委托或其他双向iVars建议的weak,否则将导致强大的引用循环。这是我应该使用它的另一个地方吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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来说,这不是什么大问题,但一般来说,最好将内存管理封装在属性访问器中,并且此时的代码行数是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12655372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档