Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iVar未使用ARC解除分配_Ios_Cocoa Touch_Cocoa_Memory Management_Automatic Ref Counting - Fatal编程技术网

Ios iVar未使用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]

在使用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];
}
我的期望是,
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没有向任何其他类公开,这是否仍然适用?此外,如果我改用属性,我是否不再需要为内存管理而烦恼?