NSMutableArray释放导致崩溃

时间:2013-02-12 06:16:53

标签: iphone objective-c memory-leaks nsmutablearray

我正在使用XCode开发iPhone应用程序。我是这个平台的新手,需要一些特殊问题的帮助...

我有一个处理一些数据的方法,并返回两个整数值作为NSNumber包装到NSMutableArray中。

以下是方法:

-(NSMutableArray *)processPoints:(int) x:(int) y
 {
 NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3];
 int x9,y9;

 // ...do some processing...

 NSNumber* xNum = [NSNumber numberWithInt:x9];
 NSNumber* yNum = [NSNumber numberWithInt:y9];

 [mutArray addObject:xNum];
 [mutArray addObject:yNum];

  return [mutArray autorelease];
 }

我从另一个方法调用上面的方法,在那里我将NSNumber东西复制到局部变量中,然后释放NSMutable数组的本地副本。

但是在发布这个NSMutable数组时,应用程序崩溃了(变量'mutArray')。

以下是方法:

-(void)doNinjaAction
 {
   NSMutableArray* mutArray = [self processPoints: x :y];

   NSNumber* s1 = [[mutArray objectAtIndex:0] retain];
   NSNumber* s2 = [[mutArray objectAtIndex:1] retain];

   x = [s1 integerValue];
   y = [s2 integerValue];

   //...proceed with other stuff...

   [mutArray autorelease]; //this is where the system crashes. same for 'release'            
                           //instead of 'autorelease'
  }

请你解释我在内存释放过程中出错的地方。

我对这个过程的理解有点不稳定。请帮忙。

6 个答案:

答案 0 :(得分:2)

因为你过度释放了数组。你在processPoints:中分配初始化它,然后你自动发布它 - 这是正确的,这就是你如何处置它的所有权。

之后,您不需要也不得自动释放或再次释放它。这不是标准库中的malloc()

答案 1 :(得分:1)

当你致电声明时

   NSMutableArray* mutArray = [self processPoints: x :y];

这本身就是自动释放。

因此,显式释放数组将导致应用程序崩溃。

答案 2 :(得分:0)

你发布mutArray一次。进入processPoints功能后再次进入doNinjaAction

解决崩溃问题:

[mutArray autorelease];

答案 3 :(得分:0)

-(NSMutableArray *)processPoints:(int) x:(int) y
 {
 NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3];
 int x9,y9;

 // ...do some processing...

 NSNumber* xNum = [NSNumber numberWithInt:x9];
 NSNumber* yNum = [NSNumber numberWithInt:y9];

 [mutArray addObject:xNum];
 [mutArray addObject:yNum];

[mutArray autorelase];
  return mutArray;
 }

尝试这个,它会解决它。

答案 4 :(得分:0)

-(NSMutableArray *)processPoints:(int) x:(int) y
 {
 NSMutableArray *mutArray =[[[NSMutableArray alloc] initWithCapacity:3]autorelease];
 int x9,y9;

 // ...do some processing...

 NSNumber* xNum = [NSNumber numberWithInt:x9];
 NSNumber* yNum = [NSNumber numberWithInt:y9];

 [mutArray addObject:xNum];
 [mutArray addObject:yNum];

  return mutArray;
 }

答案 5 :(得分:-1)

正如@ H2CO3和@AppleDelegate建议的那样,它是对的。

我仍然建议使用ARC并将您的项目转换为启用ARC。

转到Edit-> Refactor->转换为Objectiv-C ARC

然后你不需要在任何地方做任何发布。它会照顾所有版本:)