Освобождение объекта Array - PullRequest
0 голосов
/ 24 февраля 2010

Согласно анализу инструментов, у меня есть утечка памяти - и - я не уверен, как правильно выпустить созданный мной объект ScoresArray.

Этот код работает правильно, за исключением утечки. Я освобождаю объект highScoresArray позже в коде - но попытка освободить ScoresArray убивает приложение. Я думал, что когда я выпустил highScoresArray, я выпустлю ScoreSarray, так как они оба указывают на одно и то же место в памяти. Если кто-то может указать, где мое мышление ошибочно, это было бы здорово.

- (void) readScoresFile {
    // Read the Scores File, if it exists
    NSString *filePath = [self scoresFilePath];
    // Only load the file if it exists at the path
    if ([[NSFileManager defaultManager] fileExistsAtPath: filePath]) {
        scoresFileExistsFlag = YES;
        NSLog(@"SCORES FILE EXISTS - THEREFORE LOAD IT");
        NSMutableArray *scoresArray = [[NSMutableArray alloc] initWithContentsOfFile: filePath];
        highScoresArray = scoresArray;
    } else {
        scoresFileExistsFlag = NO;
        NSMutableArray *scoresArray = [[NSMutableArray alloc] init];
        highScoresArray = scoresArray;

        // No Scores File exists - we need to create and save an empty one.
        int counter = 1;
        while (counter <= 5) {
            // Set up a date object and format same for inclusion in the Scores file
            NSDate *now = [[NSDate alloc] init];
            NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
            [dateFormat setDateFormat:@"yyyy.MM.dd"]; 
            NSString *theDateNow = [dateFormat stringFromDate:now];
            // Add the score data (Score and User and date) to the runScoreDataDictionary
            runScoreDataDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
                [NSNumber numberWithInt:0], @"score", 
                [NSNumber numberWithInt:0], @"landings",
                currentUser, @"user", 
                theDateNow, @"date", nil];
            //NSLog(@"Dictionary contains: %@", runScoreDataDictionary);
            // Add the dictionary to the highScoreArray
            [highScoresArray addObject:runScoreDataDictionary];
            //NSLog(@"OBJECTS in ARRAY: %i", [highScoresArray count]);

            [self writeScoresFile]; // Write the empty scores file to disk

            [now release];
            [dateFormat release]; 

            ++counter;

            //[scoresArray release]; // TESTING TO SEE IF THIS KILLS - YES KILLS
        }
    }
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Полагаю, highScoresArray - это переменная экземпляра (поскольку она нигде не указана в указанном вами методе).Это означает, что при создании scoresArray (который является тем же объектом, что и highScoresArray), он имеет счет сохранения 1. Вы не retain это, так что release при уменьшении его счет хранения будет равен 0и он будет очищен - не очень хорошая вещь для переменной экземпляра.

Я также не уверен, зачем вы это делаете:

NSMutableArray *scoresArray = [[NSMutableArray alloc] init];
highScoresArray = scoresArray;

Кажется, вам не нужноиспользовать scoresArray в другом месте, так что вы можете просто сделать это:

[highScoresArray release];    // Release the old object
highScoresArray = [[NSMutableArray alloc] init];
1 голос
/ 24 февраля 2010

Я освобождаю объект highScoresArray позже в коде - но попытка освободить ScoresArray убивает приложение. Я думал, что когда я выпустил highScoresArray, я выпустлю ScoreSArray, поскольку они оба указывают на одно и то же место в памяти

Пока вы не изменили указатель highScoresArray, указывающий на другой объект, его освобождение будет аналогично отпусканию scoresArray.

NSMutableArray* highScoresArray;
NSMutableArray* scoresArray = [[NSMutableArray alloc] init];
highScoresArray = scoresArray;
[highScoresArray release]; // same as `[scoresArray release];`

Но если вы потом измените одну из них, чтобы указать на другой объект, их освобождение не будет эквивалентно:

NSMutableArray* highScoresArray;
NSMutableArray* scoresArray = [[NSMutableArray alloc] init];
highScoresArray = scoresArray;
// ... Now make `highScoresArray` point to another object ...
highScoresArray = [[NSMutableArray alloc] init];
// Now you should release both as they point to different objects.
[highScoresArray release];
[scoresArray release];

Конечно, простой вызов addObject не меняет указатель . Он изменяет объект, являющийся указанным на . Здесь имеет значение только переназначение указателя на другой объект.

...