iPhone - 释放内存的问题 - 内存泄漏

时间:2011-03-22 05:13:38

标签: iphone memory-leaks

我的代码如下所示。

- (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”返回一个指针,我也将释放它。我的编码方式是对还是错?

3 个答案:

答案 0 :(得分:1)

如果您只是在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更少,更清晰。

答案 1 :(得分:1)

  

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

取决于你如何看待它。

1)引用计数看起来不错

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

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

答案 2 :(得分:0)

试试这个

- (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. 您没有使用myarralloc分配new,因此您不会拥有该对象的所有权。因此发布中的问题。

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