Утечка памяти с сериализацией 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
}
Ответы
Ответ 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"];