自动化dealloc / viewDidUnload Objective-C

时间:2011-11-18 01:10:18

标签: objective-c memory-management dealloc

这两个片段是否完成了同样的事情?假设我的界面文件中有三个名为buttonOne,buttonTwo和buttonThree的IBOutlet UIButtons:

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

    [super dealloc];
}

- (void)dealloc {
    [buttonOne release], buttonOne = nil;
    [buttonTwo release], buttonTwo = nil;
    [buttonThree release], buttonThree = nil;
    [super dealloc];
}

编辑:

由于ARC有时似乎是iOS中内存管理的一种解决方案,我更喜欢不使用它,因为a)我觉得我在欺骗b)如果我没有弄错,它只适用于iOS 5设备

3 个答案:

答案 0 :(得分:5)

假设您没有任何其他子视图,那么这两段代码就会做同样的事情。但这不是你应该做的事情。

您应该声明您的商店weak(如果使用ARC)或assign(如果不使用ARC)。然后您不必在dealloc中释放它们。 UIView保留其子视图并在取消分配时释放它们,因此您无需保留或释放它们。您只需发布self.view(或者,如果您是UIViewController的子类,则让[{1}}负责发布[super dealloc])。

答案 1 :(得分:0)

不,他们不这样做,第一个将通过视图子视图中的所有视图,所有foreach都会将其转换为UIButton,但是您正在迭代视图子视图数组的整个内容..您应该这样做< / p>

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

答案 2 :(得分:0)

是和否 如果您有任何其他视图作为子视图,那么这些视图也将在第一种方法中释放,但不会在第二种方法中释放。 否则,如果只有按钮是子视图,那么这两个东西将具有相同的结果。

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