Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
Objective c 自动解除锁定/查看卸载目标-C_Objective C_Memory Management_Dealloc - Fatal编程技术网

Objective c 自动解除锁定/查看卸载目标-C

Objective c 自动解除锁定/查看卸载目标-C,objective-c,memory-management,dealloc,Objective C,Memory Management,Dealloc,这两个片段完成了相同的事情吗?假设我的界面文件中有三个名为buttonOne、buttonTwo和buttonThree的按钮: - (void)dealloc { for(UIButton* idx in self.view.subviews) [idx release], idx = nil; [super dealloc]; } 及 编辑: 由于ARC有时似乎是iOS内存管理的一个全修复替代方案,我不喜欢使用它,因为a)我觉得我在作弊,b)如果我没有弄错

这两个片段完成了相同的事情吗?假设我的界面文件中有三个名为buttonOne、buttonTwo和buttonThree的按钮:

- (void)dealloc {
    for(UIButton* idx in self.view.subviews)
        [idx release], idx = nil;

    [super dealloc];
}

编辑:


由于ARC有时似乎是iOS内存管理的一个全修复替代方案,我不喜欢使用它,因为a)我觉得我在作弊,b)如果我没有弄错的话,它只在iOS 5设备上工作。

不,它们不工作,第一个将遍历视图子视图中的所有视图,foreach所做的只是将其转换为UIButton,但是您正在遍历views子视图数组的全部内容。。你应该这样做

- (void)dealloc {
    for(UIButton* idx in self.view.subviews)
   {
        if([idx isKindOfClass:UIButton])
        { [idx release] } 
    }
    [super dealloc];
}

假设您没有任何其他子视图,这两段代码的作用是相同的。但这不是你应该做的事

您应该声明您的插座
(如果使用ARC)或
分配
(如果不使用ARC)。然后您不必在
dealloc
中释放它们。
UIView
保留其子视图,并在解除分配时释放它们,因此您不需要保留或释放它们。您只需释放
self.view
(或者,如果您是
UIViewController
的子类,您可以让
[super dealoc]
负责释放
self.view
)。

是和否 如果有任何其他视图作为子视图,那么这些视图也将在第一种方法中发布,而不是在第二种方法中发布。 否则,如果只有按钮是子视图,则“是”这两个选项将产生相同的结果


我建议查看ARC,这样您就不必担心任何内存管理业务。

Re:Edit B,您错了。完整的ARC在iOS 4.3上运行,在iOS 4.2上你可以获得大多数ARC功能,除了弱功能,你使用的是不安全的未恢复功能。天哪,我错了!ARC听起来很梦幻——我去看看。谢谢你的推荐!这是不正确的,您应该使用Strong(如果使用ARC)和retain(如果不使用ARC)。否则,如果您的视图在内存不足的情况下被卸载,那么此时您的所有输出都将消失,您可能想在释放它们之前对它们做些什么。Apple的:“输出通常应该是
弱的
,除了从文件所有者到nib文件中的顶级对象(或者在iOS中是情节提要场景)的输出除外。”这应该是
strong
“您可以在
direceivememorywarning
中“处理它们”。您是对的,我没有使用ARC,但在ARC之前,我假设声明为retain的出口在ARC中会很强,但我认为它们很弱,可以避免强引用循环。但如果不使用ARC,则应使用retain not assign。如果你能修改你的答案,我会投票,很抱歉这是我的错误。
- (void)dealloc {
    for(UIButton* idx in self.view.subviews)
   {
        if([idx isKindOfClass:UIButton])
        { [idx release] } 
    }
    [super dealloc];
}