Objective-C Алхимия управления памятью: код вызывает утечку после помещения в класс - PullRequest
0 голосов
/ 30 января 2011

Я пришел в Objective-C из C ++, поэтому у меня до сих пор иногда возникают проблемы с пониманием управления памятью в Objective-C.У меня возникла следующая проблема - XCode Analyzer говорит мне, что данные объекта * вызывают утечки в коде.

- (void)loadSettings
{

    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        NSData *data = [[NSMutableData alloc]
                        initWithContentsOfFile:[self dataFilePath]];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] 
                                         initForReadingWithData:data];
        // object *data is no longer referenced at this point and has a retain count of +1 (object leaked)
        AppData *settingsData = [unarchiver decodeObjectForKey:kDataKey]; 
        if (nil != settingsData)
        {
            customerVoiceActive = settingsData.customerVoice;
        }

        [unarchiver finishDecoding];
        [unarchiver release];
        [settingsData release];        
    }
}

Что сводит меня с ума, так это то, что точно такой же код (кроме именования) прекрасно работает и не вызывает утечек, будучи помещенным в приложение*

Ответы [ 4 ]

2 голосов
/ 30 января 2011

В примере кода 1) вы отпускаете settingsData, а в примере кода 2) вы выпускаете data. Изменение этой строки должно решить вашу проблему.

1 голос
/ 31 января 2011

«Точно такой же» код содержит дополнительную строку:

[выпуск данных];

1 голос
/ 31 января 2011

Вы забыли выпустить данные NSData *. Добавьте следующую строку после [settingsData release];:

[data release];
0 голосов
/ 31 января 2011

settingsData должен НЕ быть освобожден, поскольку он не был получен с помощью метода, который подразумевает, что вы являетесь владельцем возвращенного объекта. Тем не менее, вы ДОЛЖНЫ выпустить data, потому что вы выделили его самостоятельно, а это подразумевает владение.

...