metsburg
metsburg

Reputation: 2021

NSMutableArray release causes crash

I am using XCode for developing an iPhone app. I am new to this platform and need some help with a particular issue...

I have a method that processes some data and returns two integer values as NSNumber wrapped into a NSMutableArray.

Here is the method:

-(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];
 }

I call the above method from another method, where I copy the NSNumber stuff into local variables and then release the local copy of NSMutable array.

But the app crashes when releasing this NSMutable array (variable 'mutArray').

Here is the method:

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

Can you please explain where I am going wrong with the process of memory release.

My understanding of the process is a bit shaky. Please help.

Upvotes: 0

Views: 330

Answers (6)

Kasaname
Kasaname

Reputation: 1501

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

Upvotes: 0

Bhupendra
Bhupendra

Reputation: 2545

As @H2CO3 and @AppleDelegate suggested, it is right.

Still I would suggest to use ARC and convert your project to ARC enabled.

Go to Edit->Refactor->Convert to Objectiv-C ARC

Then you dont need to do any releases anywhere. It will take care itself of all the releases :)

Upvotes: -1

milanjansari
milanjansari

Reputation: 1549

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

try this one it'll resolve it.

Upvotes: 0

user529758
user529758

Reputation:

Because you're overreleasing the array. You alloc-init it in processPoints:, then you autorelease it - that's correct, this is how you dispose of its ownership.

After that, you don't need to and must not autorelease or release it once again. This is not malloc() from the standard library.

Upvotes: 2

Rushi
Rushi

Reputation: 4500

You are releasing mutArray more then once. Once in processPoints function and again in doNinjaAction.

To resolve the crash remove :

[mutArray autorelease];

Upvotes: 0

AppleDelegate
AppleDelegate

Reputation: 4249

when you call the statement

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

This itself acts as autorelease.

Hence releasing the array explicitly will cause the app to crash.

Upvotes: 1

Related Questions