【问题标题】:iPhone - Problems with releasing memory - memory leaksiPhone - 释放内存的问题 - 内存泄漏
【发布时间】:2011-03-22 05:13:37
【问题描述】:

我的代码如下。

- (void)viewDidLoad
{
 NSArray* myarr = [self createArray];
 for (NSString* str in myarr) 
 {
  NSLog(@"%@",str);
 }
 [myarr release];
}

-(NSArray*)createArray
{
 NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
 return arr1;
}

当我“构建和分析”时,它显示了两个泄漏。 [myarr release] 上的一个说,此时拥有的对象的引用计数减少不正确。和其他在返回 arr1,说,在第 152 行分配并存储到 arr1 中的对象的潜在泄漏。

从我上面的代码中,方法“createArray”返回一个指针,我也释放它。我的编码方式是对还是错?

【问题讨论】:

    标签: iphone memory-leaks


    【解决方案1】:

    从我上面的代码中,方法“createArray”返回一个指针,我也释放它。我的编码方式是对还是错?

    这取决于你如何看待它。

    1) 引用计数看起来不错

    2) 在某些情况下,静态分析器会根据名称标记 objc 方法。因此,如果您将 createArray 重命名为 newArray 或名为 new* 的名称,该问题可能会消失。因此它期望遵循一个约定(Apple 使用的约定)。

    因此,信息有点肤浅,它并没有真正分析程序,而是将其发现/结果基于惯例——而不是人类可以阅读的实际明显问题。

    【讨论】:

      【解决方案2】:

      如果您只是在 viewDidLoad 方法中使用数组,那么您根本不需要在其中分配数组。您可以只使用按照 7KV7 建议返回的自动释放数组。您也可以在 -(void)createArray 中返回一个自动释放的数组,而无需分配对象。这是一个例子。

      - (void)viewDidLoad
      {
       NSArray* myarr = [self createArray];
       for (NSString* str in myarr) 
       {
        NSLog(@"%@",str);
       }
      }
      
      -(NSArray*)createArray
      {
       return [NSArray arrayWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
      
      }
      

      如果您不必分配对象来使用它,那么 IMO 的代码会更少、更简洁。

      【讨论】:

      • 我知道这一点。但我基本上想知道为什么编译器会在我的代码中出现泄漏错误。请看贾斯汀的回复。无论如何感谢您的回复。
      【解决方案3】:

      试试这个

      - (void)viewDidLoad
      {
       NSArray* myarr = [[NSArray alloc] initWithArray:[self createArray]];
       for (NSString* str in myarr) 
       {
        NSLog(@"%@",str);
       }
       [myarr release];
      }
      
      -(NSArray*)createArray
      {
       NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil];
       return [arr1 auotrelease];
      }
      

      你的代码的问题是

      1. 您不会使用allocnew 分配myarr,因此您不会获得对象的所有权。因此是发布中的问题。

      2. 您分配 arr1 以便获得对象的所有权并返回 arr1。因此你不释放它。这就是泄漏的原因。

      【讨论】:

      • 他的代码没有任何泄漏。静态分析器不够聪明,无法实现这一点。您提供的代码不必要地创建了两个数组。
      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多