2011-08-03 58 views
2

我想解析使用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]; 

回答

1

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

+0

感谢您的回应,我从那之后转移到原生iOS 5 JSON解析器,它的工作原理好得多,但我尝试了您的解决方案,并删除了内存泄漏。 – Convolution

+0

@卷动,很高兴听到。只是一个偶然的警告,只使用iOS5的API意味着你不能支持iOS 4.x,这意味着该应用程序不能安装在低于并包括iPhone 3G和iPod Touch第二代的模型 –

+0

是的,是的,尽管开始在iOS 5中,我仍计划在未来的项目中包含此代码修复以支持较老的用户。 – Convolution