请帮我解决这个内存泄漏问题。在泄漏工具中,它显示了泄漏:库Foundation
负责框架中的NSCFString(32字节):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
}
答案 0 :(得分:1)
首先,确保您没有使用已弃用或过时的方法调用。根据您的应用程序配置(由您决定),您可能正在使用过时的方法调用;来自Apple docs:
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);
}
答案 1 :(得分:0)
陈述plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError];
创建一个自动释放对象。如果您的代码现在在@autoreleasepool {...}
未明确分配自动释放池的单独线程中运行,则此对象永远不会被释放并且将是泄漏。
因此,如果您的代码在单独的线程中运行,请确保您已设置自动释放池。
答案 2 :(得分:0)
通过我们在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);
}
答案 3 :(得分:0)
没有泄漏。将它全部包装在@autoreleasepool中,以确保自动释放的所有内容都会立即消失作为测试。
然后摆脱由于双重释放错误导致的潜在崩溃: 它是自动释放的,你不必再发布它!
答案 4 :(得分:0)
尝试以这种方式阅读您的plist:
NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]];
self.myarray=[dTmp valueForKey:@"Objects"];