2011-10-02 33 views
1

我遇到以下問題:在地圖上使用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我得到以下泄漏痕跡(模糊庫是我自己的庫):

All blurred responsible libraries are my own app

有沒有人建議如何解決這個問題呢?我嘗試了很多很多東西。所以關鍵問題似乎是如何正確「交出」[singleVenue objectForKey:@"name"]。我第一次嘗試設置它沒有一個副本和一個autorelease,但後來我得到一個殭屍對象。所以我不知道該怎麼做。我認爲問題不是這兩條線,而是一些線。我對嗎?我也有建議,我的第三方JSON解析器強制這個問題(比較泄漏跟蹤)。

所以我希望有人能幫我解決這個問題。會很棒!

更新:問題似乎與相應的JSON解析器無關。我用另一個解析器測試了我的代碼,那裏也存在同樣的問題。所以它必須對我的代碼本身做些事情。

我想我知道是什麼問題。所以關閉地圖後發生泄漏。所以在dealloc之後。所以可能是,我錯過了那裏的一些東西。我有一個mapview,我也釋放它在dealloc中,並將其設置爲無viewDidUnload。我也釋放所有其他陣列等dealloc。有什麼其他的(具體關於地圖和視圖),我需要釋放?我認爲這可能是問題!

更新:解決該問題:我不得不所有四方銷標題和副標題設置爲在dealloc方法零,因爲一個值(通過JSON分析器訪問)是由地圖視圖以某種方式保留。現在一切正常!

回答

1

解決該問題:我不得不所有四方銷標題和副標題設置爲在dealloc方法零,因爲一個值(通過JSON分析器訪問)是由地圖視圖以某種方式保留。現在一切正常!

0

有過類似的情況,註解的(MKPointAnnotation)標題沒有正確釋放。通過在發佈之前將mapView設置爲零來解決它。

我認爲這比調用一個額外的[標題發佈]更安全,它也可以工作,但是如果mapView在內部修復,會導致問題。