SBJSON解析器内存泄漏
问题描述:
我想解析使用SBJSON的JSON订阅源,但每次我通过仪器运行它时,都会在一行中出现100%的内存泄漏。我肯定有不正确的东西,希望有所洞察。SBJSON解析器内存泄漏
我有一个城镇桌面,当你点击一个城镇时,这个饲料将运行并获取住在镇上的人的列表,并在桌面视图中解析它们。然而,每次我弹出的细节视图返回城镇的名单,并进入一个新的细节来看我结束了内存泄漏
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];
答
您已经创建了一个NSArray称为buildingArray
,但后来加入的对象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
是方便的方法加入到的NSString由SBJSON框架,
你没有修改代码中的peopleDictionary,所以它不需要可变。
另外,无论您是否使用便捷方法,SBJSON框架都不会返回可变对象,所以如果您试图使用可变类的方法,编译器就不会警告您,但应用程序在崩溃时会崩溃你达到了它。
感谢您的回应,我从那之后转移到原生iOS 5 JSON解析器,它的工作原理好得多,但我尝试了您的解决方案,并删除了内存泄漏。 – Convolution
@卷动,很高兴听到。只是一个偶然的警告,只使用iOS5的API意味着你不能支持iOS 4.x,这意味着该应用程序不能安装在低于并包括iPhone 3G和iPod Touch第二代的模型 –
是的,是的,尽管开始在iOS 5中,我仍计划在未来的项目中包含此代码修复以支持较老的用户。 – Convolution