Утечка памяти с сериализацией Plist

Пожалуйста, помогите мне с этой утечкой памяти. В инструменте утечек это показывает утечку: NSCFString (32 байта) в библиотеке Foundation Ответственный кадр: NSPropertyListSerialization, Я выпускаю ошибку, но все еще утечка. Что мне не хватает? Большое спасибо!

    NSPropertyListFormat format; 
    NSString *anError = nil;
    id plist;
    plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError];
    if (!plist){
          [anError release];
    } 
    NSArray *entries = (NSArray *)plist;
    for (NSDictionary *entry in entries) 
    {
      // DO SOMETHING
    }

5 ответов

Во-первых, убедитесь, что вы не используете устаревшие или устаревшие вызовы методов. В зависимости от конфигурации вашего приложения (это вам решать) вы можете использовать устаревшие вызовы методов; из документов Apple:

propertyListFromData:mutabilityOption:format:errorDescription:

Этот метод устарел и скоро будет устаревшим. (Устаревший. Использование propertyListWithData:options:format:error: вместо.)

Я не обнаружил утечку памяти после использования рекомендованного вызова API... Тестовый код:

NSArray *somearray = @[@"One",@"Two",@"Three"];
NSData *rawCourseArray = [NSKeyedArchiver archivedDataWithRootObject:somearray];

NSPropertyListFormat format;
NSError *anError = nil;
id plist;
plist = [NSPropertyListSerialization propertyListWithData:rawCourseArray options:NSPropertyListImmutable format:&format error:&anError];
if (!plist){
    [anError release];
}
NSArray *entries = (NSArray *)plist;
for (NSDictionary *entry in entries)
{
    // DO SOMETHING
    NSLog(@"%@",entry);
}

Попробуйте прочитать ваш список следующим образом:

NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]];


self.myarray=[dTmp valueForKey:@"Objects"];

Нет утечки. оберните все это в @autoreleasepool, чтобы быть уверенным, что все, что автоматически выпущено, сразу же отправляется в качестве теста.

ТОГДА избавьтесь от потенциального сбоя, вызванного двойным освобождением от anError: он автоматически выпускается, и вам не нужно его снова выпускать!

Попробуйте это, мы получаем словарь в темп

    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    if (!temp)
   {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }

Заявление plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; создает объект автоматического выпуска. Если ваш код теперь выполняется в отдельном потоке, которому не был явно назначен пул автоматического выпуска @autoreleasepool {...}этот объект никогда не может быть выпущен и будет утечка.
Поэтому убедитесь, что вы настроили пул автоматического выпуска, если ваш код выполняется в отдельном потоке.

Другие вопросы по тегам