[英]SBJSON Parser Memory Leak
我正在尝试使用SBJSON解析JSON提要,但是每次通过仪器运行它时,我都会在一行上发生100%的内存泄漏。 我肯定有一些不正确的地方,并希望获得一些见识。
我有一个Towns的表格视图,当您单击一个城镇时,此提要将运行并获取一个居住在该城镇中的人的列表,并在表格视图中对其进行解析。 但是,每次我将详细信息视图弹出到城镇列表并进入新的详细信息视图时,都会导致内存泄漏
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框架都不会返回可变对象,因此,如果您尝试使用可变类的方法,则编译器不会警告您,但是当您到达时,应用程序将崩溃它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.