在地图上使用json数据时内存泄漏

时间:2011-10-02 09:10:02

标签: json memory-leaks ios4 mkmapview mkannotation

我遇到以下问题:

我正在访问foursquares 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"]。我首先尝试设置它没有副本和自动释放,但后来我得到一个僵尸对象。所以我不知道该怎么做。我认为问题不在于这两行,而是在它们之上的一些行。我对吗?我也有建议,我的第三方json解析器正在强制解决这个问题(参见泄漏跟踪)。

所以我希望有人可以帮我解决这个问题。会真的很棒!

更新:问题似乎与相应的JSON解析器无关。我用另一个解析器测试我的代码,同样的问题。所以它必须对我的代码本身做一些事情。

我想我知道这是什么问题。因此在关闭地图后会发生泄漏。所以在dealloc之后。所以可能是,我错过了那里的东西。我有一个mapview,我也在dealloc中释放它,并在viewDidUnload中将其设置为nil。我也在dealloc中释放所有其他数组等。我需要发布其他东西(具体关于地图和视图)吗?我想这可能是问题!

更新:解决了问题:我必须在dealloc方法中将所有Foursquare引脚的标题和副标题设置为nil,因为地图视图保留了一个值(通过JSON解析器访问)不知何故。现在一切正常!

2 个答案:

答案 0 :(得分:1)

解决了问题:我必须在dealloc方法中将所有Foursquare引脚的标题和副标题设置为nil,因为地图视图以某种方式保留了一个值(通过JSON解析器访问)。现在一切正常!

答案 1 :(得分:0)

有类似情况,注释(MKPointAnnotation)标题未正确发布。通过在释放之前简单地将mapView设置为nil来解决它。

我认为这比调用额外的[标题发布]更安全,这也有效,但如果mapView在内部修复,则会导致问题。