12

请帮我解决这个内存泄漏问题。在泄漏工具中,它显示了一个泄漏:NSCFString (32 bytes) in library FoundationResponsible Frame: 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
    }
4

5 回答 5

1

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

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);
}
于 2013-02-05T04:07:01.727 回答
0

该语句plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; 创建一个自动释放对象。如果你的代码现在运行在一个没有明确分配自动释放池的单独线程中@autoreleasepool {...},那么这个对象将永远不会被释放并且将是一个泄漏。
因此,如果您的代码在单独的线程中运行,请确保您已设置自动释放池。

于 2013-02-03T20:54:59.390 回答
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);
    }
于 2013-04-04T11:55:12.943 回答
0

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

然后摆脱由 anError 的双重释放引起的潜在崩溃:它是自动释放的,您不必再次释放它!

于 2013-04-29T07:58:55.007 回答
0

尝试以这种方式阅读您的 plist:

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


self.myarray=[dTmp valueForKey:@"Objects"];
于 2013-07-12T12:13:55.630 回答