我正在尝试使用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];
答案 0 :(得分: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框架,无论你是否使用方便方法,都不返回可变对象,所以如果你试图使用可变类的方法,编译器就不会警告你,但当你到达时应用程序会崩溃它。