Objective c 自动解除锁定/查看卸载目标-C
这两个片段完成了相同的事情吗?假设我的界面文件中有三个名为buttonOne、buttonTwo和buttonThree的按钮: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)如果我没有弄错
- (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];
}