Проблема с утечкой NSMutableArray - PullRequest
0 голосов
/ 15 апреля 2011

Я думал, что знаю, как бороться с утечками памяти и массивами, но потом это всплывает. Я не могу понять, почему это протекает:

//  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 ]

4 голосов
/ 15 апреля 2011

Ваша проблема здесь:

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 в качестве атрибута-мутатора свойства, объект будет сохранен, когда он будет передан в установщик свойств, поэтому у вас есть утечка, когда вы retain объект, владельцем которого вы уже владеете.

Решением этой проблемы может быть либо a) Передача объекта autorelease -d в установщик свойств или b) Присвоение ivar напрямую выделенному объекту.

2 голосов
/ 15 апреля 2011

Вы выделяете новый массив, затем устанавливаете его для свойства сохранения. Измените эту строку на

self.myMutableArray = [NSMutableArray array]; 
1 голос
/ 15 апреля 2011
self.myMutableArray = [[NSMutableArray alloc] init];

должно быть

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

, поскольку myMutableArray является сохраняемым свойством.

...