Утечка памяти с сериализацией 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 {...}
этот объект никогда не может быть выпущен и будет утечка.
Поэтому убедитесь, что вы настроили пул автоматического выпуска, если ваш код выполняется в отдельном потоке.