Objective c Plist序列化的内存泄漏

Objective c Plist序列化的内存泄漏,objective-c,serialization,memory-leaks,property-list,Objective C,Serialization,Memory Leaks,Property List,请帮我解决这个内存泄漏问题。在leaks工具中,它在库Foundation责任框架:NSPropertyListSerialization中显示泄漏:NSCFString(32字节)。我正在发布错误,但仍然存在漏洞。我错过了什么?非常感谢 NSPropertyListFormat format; NSString *anError = nil; id plist; plist = [NSPropertyListSerialization propertyList

请帮我解决这个内存泄漏问题。在leaks工具中,它在库
Foundation
责任框架:
NSPropertyListSerialization
中显示泄漏:NSCFString(32字节)。我正在发布错误,但仍然存在漏洞。我错过了什么?非常感谢

    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
    }

语句
plist=[NSPropertyListSerialization propertyListFromData:RawCoursarray可变选项:NSPropertyListMutable格式:&format errorDescription:&anError]
创建自动释放对象。如果您的代码现在运行在一个单独的线程中,而
@autoreleasepool{…}
没有显式地将autorelease池分配给该线程,则此对象将永远不会被释放,并且将成为泄漏。

因此,如果代码在单独的线程中运行,请确保您已经设置了自动释放池。

首先,确保您没有使用不推荐或过时的方法调用。根据您的应用程序配置(这由您决定),您可能正在使用过时的方法调用;来自苹果文档:


此方法已过时,不久将被弃用。(已弃用。改用
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);
}

试试这个,我们可以在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);
    }

没有泄漏。将其全部封装在@autoreleasepool中,以确保自动删除的所有内容作为测试立即消失

然后消除由双重无错误导致的潜在崩溃:
它是自动释放的,你不必再次释放它

试着用以下方式阅读您的plist:

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


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

关于这一点,有各种各样的帖子说这是一个苹果的错误,有人说使用NSPropertyListSerialization选项:format:error,还有人说切换到JSON序列化,但我还没有找到一个很好的答案。我看到一个错误:你不应该在代码中执行
[anError release]
;您不拥有对
错误的引用
propertyListFromData:
将在返回代码之前自动删除它。然而,这是一个双重免费的错误,而不是泄漏。我没有看到你发布的代码有任何泄漏。在调试器中,输入泄漏字符串的值,看看它是否给你任何提示。尝试检查设备上的内存泄漏,一些Apple LIB在模拟器上有轻微泄漏。不要释放错误,它是一个自动释放对象。代码似乎是正确的。+1表示注意到过时的方法,这确实可能是问题所在。但是,请删除
[error release]
行,非常感谢;)
propertyListWithData:options:format:error:
也存在泄漏。
NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]];


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