SBJSON 解析器内存泄漏

Posted

技术标签:

【中文标题】SBJSON 解析器内存泄漏【英文标题】:SBJSON Parser Memory Leak 【发布时间】:2011-08-03 16:28:42 【问题描述】:

我正在尝试使用 SBJSON 解析 JSON 提要,但每次我通过仪器运行它时,我都会在一行上得到 100% 的内存泄漏。我肯定有一些不正确的地方,并希望得到一些见解。

我有一个城镇的表格视图,当您单击一个城镇时,此提要将运行并获取居住在该城镇的人的列表并在表格视图中解析他们。但是,每次我将详细信息视图弹出回城镇列表并进入新的详细信息视图时,都会出现内存泄漏

 SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease];
            NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];

        id response = [parser objectWithString:jsonString error:NULL]; //100.0% memory leak

        NSMutableDictionary *peopleDictionary = (NSMutableDictionary *)response;

        NSMutableArray *buildingArray = [[NSMutableArray alloc] init];

        if (peopleDictionary != nil) 
            for (NSDictionary *dict in peopleDictionary)   
                Person *incoming = [[Person alloc] init];
                incoming.firstName = [dict objectForKey:@"firstName"];
                incoming.lastName = [dict objectForKey:@"lastName"];
                incoming.address = [dict objectForKey:@"address"];
                [buildingFeedArray addObject:incoming];
                [incoming release];
            
        
        [jsonString release];
        self.peopleArray = buildingFeedArray;
        [self.tableView reloadData];
        [buildingFeedArray release];

【问题讨论】:

【参考方案1】:

您创建了一个名为buildingArray 的NSArray,但随后将对象添加到buildingFeedArray,并释放了buildingFeedArray

您需要更改第 5 行:

NSMutableArray *buildingArray = [[NSMutableArray alloc] init];

收件人:

NSMutableArray *buildingFeedArray = [[NSMutableArray alloc] init];

你应该尽快释放对象,所以在你发布的代码中你没有在解析后使用jsonString,所以你应该直接释放它。


您还可以通过替换来简化代码:

SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease];
NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];
id response = [parser objectWithString:jsonString error:NULL]; //100.0% memory leak
NSMutableDictionary *peopleDictionary = (NSMutableDictionary *)response;

与:

NSString *jsonString = [[NSString alloc] initWithData:[request responseData] encoding:NSUTF8StringEncoding];
NSDictionary *peopleDictionary = (NSDictionary *)[jsonString JSONValue];

JSONValue是SBJSON框架添加到NSString的便捷方法,

而且您没有在代码中修改 peopleDictionary,因此它不需要是可变的。 此外,SBJSON 框架,无论您是否使用便捷方法,都不会返回可变对象,因此如果您尝试使用可变类的方法,编译器不会警告您,但应用程序会在您到达时崩溃它。

【讨论】:

感谢您的回复,从那以后我开始使用本地 ios 5 JSON 解析器,它的效果要好得多,但我在我的项目中尝试了您的解决方案,它消除了内存泄漏。跨度> @convolution,很高兴听到。只是一个不经意的警告,仅使用 iOS5 API 意味着您无法支持 iOS 4.x,这意味着该应用程序无法安装在低于并包括 iPhone 3G 和 iPod Touch 2nd Gen 的机型上。 对,是的,尽管从 iOS 5 开始,我仍然计划在未来的项目中包含此代码修复以支持老用户。

以上是关于SBJSON 解析器内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用 BeautifulSoup 和 Requests 解析 html 页面源时出现内存泄漏

内存泄漏与自动释放的字符串 iphone

RedisTokenStore 源码解析 以及内存泄漏问题

如何在源代码中查找内存泄漏

Java内存泄漏解析!

iOS XML Parser 内存泄漏与 KissXML