Arumugam
Arumugam

Reputation: 43

NSMutableArray with memory leak

I am using following code to create NSMutableArray. When I run the same in “Profile” mode, it is showing a memory leakage.

SampleArray.h

@interface SampleArray: NSObject {
}
@property (assign, retain) NSMutableArray *array;
@end

SampleArray.m

#import "SampleArray.h"
@implementation SampleArray
@synthesize array;
-(void) viewDidLoad {
    self.array =[ [NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self.array release];
}
@end

When I am using autorelease, then I can’t able to access the same in other function or method and return null value. Please help me to find the issue.

Upvotes: 0

Views: 205

Answers (4)

Inder Kumar Rathore
Inder Kumar Rathore

Reputation: 39998

First of all I'm assuming that you are using

@property (nonatomic, retain) NSMutableArray *array;

use this

-(void) viewDidLoad {
    array =[[NSMutableArray alloc] init];
}

-(void) viewWillDisappear:(BOOL)animated {
    [array release];
}

I will recommend you to use dealloc instead of viewWillDisappear

-(void) dealloc {
    [array release];
    [super dealloc];
 }

Explanation of your code

   -(void) viewDidLoad {
        // here you are allocating a mutable array thus retain count becomes one
        // then you are assigning it to the property which is retain and thus retains it
        // making the retain count 2
        self.array =[ [NSMutableArray alloc] init];
    }

    -(void) viewWillDisappear:(BOOL)animated {
        // here you are releasing it so its retain count becomes 1 from 2
        // thus shows memory leak
        [self.array release];
    }

Upvotes: 0

Raymond Wang
Raymond Wang

Reputation: 1484

It is better to handle memory de-allocation in your -dealloc() and set your array to nil to be more secure in your -viewDidUnload()

so it will be:

-(void) viewDidUnload 
{
    self.array = nil;
}

-(void) dealloc
{
    [array release];

    [super dealloc];
}

and like other people said, declare your property as (nonatomic, retain) instead of (assign, retain)

Upvotes: 0

CSmith
CSmith

Reputation: 13458

releasing this array in viewWilLDisappear is not a good idea, you should release in the dealloc function. You should worry about over-releasing this item and causing a program crash since viewWilLDisappear may get called multiple times during the lifetime of this ViewController.

Anyhow, you are double retaining the item beacuse your property has a retain on it (and make it nonatomic, not assign), add an autorelease to your alloc/init:

self.array =[[[NSMutableArray alloc] init] autorelease]; 

and move

[array release];

to your dealloc function. Or convert to ARC and don't worry any longer...

Upvotes: 1

glenn sayers
glenn sayers

Reputation: 2414

Try setting it to (nonatomic, retain), then autoreleasing.

Upvotes: 0

Related Questions