2011-08-03 59 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