gpt4 book ai didi

iphone - SBJSON 解析器内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:55:57 27 4
gpt4 key购买 nike

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

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

 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];

最佳答案

您创建了一个名为 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 框架都不会返回可变对象,因此如果您尝试使用可变类的方法,编译器不会警告您,但应用程序会在您到达时崩溃它。

关于iphone - SBJSON 解析器内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6929855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com