我遇到以下問題:在地圖上使用json數據時發生內存泄露
我正在訪問foursquare的Venue API並獲取JSON字符串。我用this json-framework解析這個字符串。之後,我正在保存字典和陣列以訪問有關場館的更多信息(特別是我使用探索API)。所以場地信息在json結構樹中被深入地保存(以我的經驗)。在獲得所需信息(地點名稱&座標)後,我在地圖上放置了一個相應的管腳,地圖上有相同的座標,地點名稱與管腳名稱相同。
正好在我想要設置引腳名稱的位置時,出現內存泄漏。所以在這裏出了問題。如果我沒有設置任何標題,所有工作都很好。所以只有當我將場地的名稱設置爲引腳時纔會發生內存泄漏。
下面是相應的代碼片段:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//Parse JSON string
// Store incoming data into a string
NSString *jsonString = [[NSString alloc] initWithData:self.fetchedJSONData encoding:NSUTF8StringEncoding];
[self.fetchedJSONData setLength:0];
// Create a dictionary from the JSON string
NSDictionary *results = [NSDictionary dictionaryWithDictionary:[jsonString JSONValue]];
[jsonString release];
NSDictionary *response = [NSDictionary dictionaryWithDictionary:[results objectForKey:@"response"]];
NSArray *groups = [NSArray arrayWithArray:[response objectForKey:@"groups"]];
NSDictionary *groupsDic = [groups lastObject];
NSArray *items = [NSArray arrayWithArray:[groupsDic objectForKey:@"items"]];
for (int i=0; i<[items count]; i++)
{
CLLocationCoordinate2D annotationCoord;
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
NSDictionary* oneItemDoc = [NSDictionary dictionaryWithDictionary:[items objectAtIndex:i]];
NSDictionary *singleVenue = [NSDictionary dictionaryWithDictionary:[oneItemDoc objectForKey:@"venue"]];
/*
* Leak here in the next two lines!
*
*/
NSString *titleName = [[[singleVenue objectForKey:@"name"] copy] autorelease];
annotationPoint.title = titleName;
NSDictionary *locationOfVenue = [NSDictionary dictionaryWithDictionary:[singleVenue objectForKey:@"location"]];
annotationCoord.latitude = [[locationOfVenue objectForKey:@"lat"] doubleValue];
annotationCoord.longitude = [[locationOfVenue objectForKey:@"lng"] doubleValue];
annotationPoint.coordinate = annotationCoord;
[self.mapView addAnnotation:annotationPoint];
[self.annotationsArray addObject:annotationPoint];
[annotationPoint release];
}
}
當我要設置標題爲annotationPoint因此發生泄漏。
對於每個場館獲取與JSON我得到以下泄漏痕跡(模糊庫是我自己的庫):
有沒有人建議如何解決這個問題呢?我嘗試了很多很多東西。所以關鍵問題似乎是如何正確「交出」[singleVenue objectForKey:@"name"]
。我第一次嘗試設置它沒有一個副本和一個autorelease,但後來我得到一個殭屍對象。所以我不知道該怎麼做。我認爲問題不是這兩條線,而是一些線。我對嗎?我也有建議,我的第三方JSON解析器強制這個問題(比較泄漏跟蹤)。
所以我希望有人能幫我解決這個問題。會很棒!
更新:問題似乎與相應的JSON解析器無關。我用另一個解析器測試了我的代碼,那裏也存在同樣的問題。所以它必須對我的代碼本身做些事情。
我想我知道是什麼問題。所以關閉地圖後發生泄漏。所以在dealloc之後。所以可能是,我錯過了那裏的一些東西。我有一個mapview,我也釋放它在dealloc中,並將其設置爲無viewDidUnload。我也釋放所有其他陣列等dealloc。有什麼其他的(具體關於地圖和視圖),我需要釋放?我認爲這可能是問題!
更新:解決該問題:我不得不所有四方銷標題和副標題設置爲在dealloc方法零,因爲一個值(通過JSON分析器訪問)是由地圖視圖以某種方式保留。現在一切正常!