0

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

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

这是方法:

-(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'
  }

你能解释一下我在内存释放过程中哪里出错了。

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

4

6 回答 6

2

因为你过度释放了数组。您将其分配初始化processPoints:,然后自动释放它-没错,这就是您处置其所有权的方式。

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

于 2013-02-12T06:22:11.683 回答
1

当你调用语句时

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

这本身就起到自动释放的作用。

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

于 2013-02-12T06:19:58.707 回答
0

您不止一次发布 mutArray。一次在processPoints函数中,再次在doNinjaAction.

要解决崩溃删除:

[mutArray autorelease];
于 2013-02-12T06:22:03.730 回答
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;
 }

试试这个,它会解决它。

于 2013-02-12T06:23:57.473 回答
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;
 }
于 2013-02-14T04:48:27.027 回答
-1

正如@H2CO3 和@AppleDelegate 所建议的那样,这是正确的。

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

转到编辑->重构->转换为Objectiv-C ARC

然后你不需要在任何地方做任何发布。它将自行处理所有版本:)

于 2013-02-12T07:56:00.463 回答