Утечка памяти с сериализацией Plist - PullRequest
12 голосов
/ 23 августа 2010

Пожалуйста, помогите мне с этой утечкой памяти.В инструменте утечки это показывает утечку: 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 ]

1 голос
/ 05 февраля 2013

Во-первых, убедитесь, что вы не используете устаревшие или устаревшие вызовы методов. В зависимости от конфигурации вашего приложения (это вам решать) вы можете использовать устаревшие вызовы методов; из документов 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);
}
0 голосов
/ 12 июля 2013

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

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


self.myarray=[dTmp valueForKey:@"Objects"];
0 голосов
/ 29 апреля 2013

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

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

0 голосов
/ 04 апреля 2013

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

    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);
    }
0 голосов
/ 04 февраля 2013

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

...