Подтвердить что ты не робот

Утечка памяти с сериализацией 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
    }
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Попробуйте это, мы получим словарь в 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);
    }

Ответ 4

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

THEN избавиться от этой потенциальной аварии, вызванной двойным свободным от anError: он автореализован, и вам не нужно его снова выпускать!

Ответ 5

Попытайтесь прочитать свой слой таким образом:

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


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