NSMutableArray泄漏问题

时间:2011-04-14 21:38:02

标签: iphone objective-c memory-leaks nsmutablearray

我以为我知道如何处理内存泄漏和数组,但随后会弹出。我无法想象为什么这是泄漏:

//  MyViewController.h

NSMutableArray      *myMutableArray;

@property (nonatomic, retain) NSMutableArray *myMutableArray;

//  MyViewController.m

@synthesize myMutableArray;

- (void) viewDidLoad {

    if (self.myMutableArray == nil) {
        self.myMutableArray = [[NSMutableArray alloc] init];
    }

    . . .

    for (NSUInteger i = 0; i < someCount; ++i) {

        [self.myMutableArray addObject:[NSString stringWithFormat: @"%@",myString]];

    }

}

- (void)viewDidUnload {
    self.myMutableArray = nil
}

- (void)dealloc {
     [myMutableArray release];
} 

3 个答案:

答案 0 :(得分:4)

你的问题在这里:

if (self.myMutableArray == nil) {
    self.myMutableArray = [[NSMutableArray alloc] init];
}

应该是:

if (myMutableArray == nil) {
   self.myMutableArray = [[[NSMutableArray alloc] init] autorelease];
}

或者:

if (myMutableArray == nil) {
   myMutableArray = [[NSMutableArray alloc] init];
}

说明:

由于您使用retain作为属性mutator属性,因此在将对象传递给属性设置器时将保留该对象,因此当您retain已拥有所有权的对象时,您会发生泄漏的。

对此的解决方案是:a)将autorelease - d对象传递给属性设置器或b)将ivar直接分配给已分配的对象。

答案 1 :(得分:2)

您正在分配一个新数组,然后将其设置为retain属性。将该行更改为

self.myMutableArray = [NSMutableArray array]; 

答案 2 :(得分:1)

self.myMutableArray = [[NSMutableArray alloc] init];

应该是

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

因为myMutableArray是一个保留属性。