【问题标题】:memory leak on dealloc释放内存泄漏
【发布时间】:2012-06-08 06:43:27
【问题描述】:

我是 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;
}

请帮帮我。谢谢...

【问题讨论】:

    标签: iphone memory-management memory-leaks


    【解决方案1】:

    您需要将[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

    【讨论】:

      【解决方案2】:

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

      您可以在此处阅读有关 ARC 的更多信息:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

      【讨论】:

      • 如果你只是想修复一个简单的内存泄漏,在现有项目中打开 ARC 有点矫枉过正。
      • 但是如果你开始做 iOS 开发,那就太好了(就像这个人一样)
      【解决方案3】:

      无需从超级视图中删除这些子视图,因为无论如何您都将释放超级视图本身。

      您可以按如下方式制作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)。

      【讨论】:

      • 谢谢你 aadhira...但是我为什么要在最后写 [super dealloc]?我的意思是如果我在顶部写 [super dealloc] 那么会发生什么,如果我写在最后那么会发生什么?
      猜你喜欢
      • 2011-01-27
      • 2014-08-26
      • 1970-01-01
      • 2018-06-04
      • 2014-09-19
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多