Утечка памяти, даже если освобождаются все ресурсы - PullRequest
2 голосов
/ 28 октября 2011

Последние два дня я потратил на поиск утечек памяти. Я прочитал документацию и искал в интернете полезную информацию (например, Оуэн Госс "Поиск и устранение утечек памяти в приложениях для iOS"), но все же мне предстоит разгадать слишком много загадок.

Например, этот фрагмент кода снова и снова загорается в Инструментах. Я старался изо всех сил, но не могу это исправить.

- (void) updateUserDefaults
{
    // alloc temporary Array for object´s positions
    NSMutableArray *tArray = [[NSMutableArray alloc] init];

    // store locations of objects
    for (int i=0; i<[originalOrigins count]; ++i) {
        CGPoint foo = [self.view viewWithTag:100+i].center;
        NSString *moo = NSStringFromCGPoint(foo);
        [tArray addObject:moo];
        [moo release]; //?
    }

    // retrieve all stored positions for all objects
    NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain];

    // replace with objects from this level
    [zettelPannedOrigins replaceObjectAtIndex:zettelAtIndexInTonebank withObject:tArray];

    // save
    [[NSUserDefaults standardUserDefaults] setObject:zettelPannedOrigins forKey:@"zettelPannedOrigins"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    // clean up memory
    [tArray release];
    [zettelPannedOrigins release]; //?

}

То, что я думаю, может быть интересным и для других, - это то, что я высвобождаю то, что я выделяю. Но все же это протекает. На это я не могу ответить с документацией. Или я могу?

Ответы [ 2 ]

9 голосов
/ 28 октября 2011
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain];

У этого счетчика будет 2, так как mutableCopy сохраняет его один раз, и вы снова вызываете retain. Не звоните retain сюда.

Помните, что если вы вызываете метод с new, alloc, retain или copy в имени, вы затем владеете этим объектом, и количество сохраняемых данных увеличивается.

1 голос
/ 28 октября 2011

[NSObject mutableCopy]; вернет вам объект с увеличенным retainCount на 1, так что вам не нужно другое 'retain'.

NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] autorelease];

Это должно сделать работу :)

...