dealloc上的内存泄漏

时间:2012-06-04 06:26:40

标签: iphone memory-management memory-leaks

我是iPhone开发的新手。 我在我的NIB文件中使用了UIView,UIImageView,UIScrollView等。 我的问题是,我可以从SuperView中删除所有视图吗? 例如:`

-(void)dealloc
{
    [super dealloc];
    [imageView removeFromSuperview];
    [View1 removeFromSuperview];
    [View2 removeFromSuperview];      
    [ScrollView removeFromSuperview];

    [imageView release];
    [View1 release];
    [View2 release];
    [ScrollView release];

    imageView = nil;
    View1 = nil;
    View2 = nil;
    ScrollView = nil;
}

请帮帮我。谢谢你...

3 个答案:

答案 0 :(得分:4)

您需要将[super dealloc];称为最后事物,而不是第一个。那是因为[super dealloc]清理了你的对象,之后访问实例变量是未定义的行为:任何事情都可能发生。例如,[super dealloc]可以将所有实例变量设置为nil,在这种情况下,以下release调用不会产生任何影响(从而导致泄漏)。此外,无需将实例变量设置为nil,因为您无论如何都不会使用它们。所以你需要的只是:

-(void)dealloc
{
    [imageView release];
    [View1 release];
    [View2 release];
    [ScrollView release];

    [super dealloc];
}

还有一些注意事项:removeFromSuperview调用无害,但不必要,这由[super dealloc]隐式完成。你应该坚持Apples命名约定,在你的情况下,你不应该用大写字母开始变量名。因此它应该是scrollView而不是ScrollView

答案 1 :(得分:1)

无需从superview中删除这些子视图,因为无论如何你都要发布superview本身。

您可以按如下方式设置dealloc

-(void)dealloc{

    [imageView release];
    [View1 release];
    [View2 release];
    [ScrollView release];

    imageView = nil;
    View1 = nil;
    View2 = nil;
    ScrollView = nil;

    [super dealloc];
}

请注意,[super dealloc]位于最后(More info)。

答案 2 :(得分:0)

您可能希望在项目中启用ARC。您不再需要释放这些对象了;系统将负责(大部分)您的内存管理。

您可以在此处详细了解ARC:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html