Ios iVar未使用ARC解除分配
在使用ARC的类的实现文件中,我有一个Ios iVar未使用ARC解除分配,ios,cocoa-touch,cocoa,memory-management,automatic-ref-counting,Ios,Cocoa Touch,Cocoa,Memory Management,Automatic Ref Counting,在使用ARC的类的实现文件中,我有一个UIScrollView声明为iVar: @interface RecipeBrowserViewController () { UIScrollView *tempScrollView; } 这是必要的,因为在执行过程中,我有时需要将UIScrollView添加到我的视图中,而其他时候则需要删除相同的UIScrollView: if (someTest) { tempScrollView = [[UIScrollView alloc]
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];
}
我的期望是,tempsrollview
一旦从superview
中删除,就会被释放,但事实并非如此。大概是因为iVar还在引用它
在从
superview
中删除后添加tempsrollview=nil
可以清除这个问题,但我不确定正确的方法是什么。我应该声明一个弱iVar吗?到目前为止,我只看到为代表或其他双向IVAR建议的弱,否则将导致一个强参考周期。这是我应该使用它的另一个地方吗?添加/删除滚动视图是ivar内存管理的另一个问题。您所得到的是正确的,除了在使用tempsollview时确实应该将ivar设置为nil
将视图B(滚动视图)添加为视图a(self.View)的子视图时,视图a保留对视图B的强引用(即保留)。将视图B作为子视图删除时,视图a删除对视图B的强引用(即释放)。但是,ivar tempScrollView很强,因此视图控制器(self)维护对scrollview的强引用,如您所见,它不会被释放。删除强引用的方法是将ivar设置为零
我想补充一点,在我看来,您应该为tempScrollView使用@property,而不是直接使用ivar。对于ARC来说,这并不是什么大问题,但一般来说,最好将内存管理封装在属性访问器中,此时的代码行数相同。您应该在-dealoc
@H2CO3中将ivar设置为零,这对于ARC来说是不必要的。您几乎不需要实现dealoc
@carlvaezey即使使用ARC,您也必须实现-dealoc
。你只需要不调用[super dealoc]
@H2CO3也许我遗漏了什么,但苹果发行说明和我的经验表明,只有在需要发布共享资源时才需要实现它,但管理实例变量不需要任何东西。@H2CO3,Carl Veazey:ARC规范确认强实例变量引用将自动释放。这并不完全正确。将视图添加为子视图将为其添加另一个引用-将其从其superview中删除将采用该引用的方式。添加和删除子视图对内存管理影响很大。@Rickay,是的,当然,我最初的回答有点简单,我已经对其进行了更详细的解释。谢谢。我需要检查所有代码并应用相同的逻辑。来到iOS post ARC,直到现在才检查我的应用程序的性能和内存管理,我才意识到ARC并不是完全忽略内存的借口。至于你对使用属性的评论-如果tempScrollView没有向任何其他类公开,这是否仍然适用?此外,如果我改用属性,我是否不再需要为内存管理而烦恼?