内存泄漏与Plist序列化

时间:2010-08-23 00:40:37

标签: objective-c serialization memory-leaks property-list

请帮我解决这个内存泄漏问题。在泄漏工具中,它显示了泄漏:库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
    }

5 个答案:

答案 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"];