【问题标题】:addAnnotations issue (memory management maybe?)addAnnotations 问题(可能是内存管理?)
【发布时间】:2009-09-07 16:31:34
【问题描述】:

我在使用 MKMapView / annotations / UINavigationController 时遇到了一些问题。基本上,我使用 UINavigationController 管理我的视图;我的一个视图包含一个 MKMapView,我使用 addAnnotations 方法在其上添加注释(10 到 200)。

除了一件事之外,一切都运行良好:如果我在 UINavigationController 上导航“太快”,则 iphone 模拟器崩溃,接收到“EXC BAD ACCESS”信号。例如,如果我加载包含 MKMapView 的视图并立即按下 UINavigationController 导航栏中的“返回”按钮,我会收到信号。我认为问题出在 addAnnotations 方法上:当我的 MKMapView 加载时,我向它添加注释,但看起来一切都是异步完成的。如果我在按下“返回”按钮之前等待一秒钟,我不会收到任何错误,但如果我太快,它就会崩溃。如果我删除 addAnnotations 行,我根本不会出错。我想这是因为我的视图是在 addAnnotations 方法完成工作之前由 UINavigationController 释放的。

有什么好的解决办法吗?我不希望用户等待(例如显示加载视图);我想解决方案可能是更好的内存管理,但我不知道我该怎么做。

    if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : begin"); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
    [self.placemarkCache addObject:currentPlacemark];
    [currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : done"); }
if(DEBUG_MODE) { NSLog(@"Adding placemarks : begin"); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@"Adding placemarks : done"); }

在此示例中,我在地图上显示任何内容之前收到“添加地标:完成”消息。

【问题讨论】:

    标签: iphone objective-c mapkit


    【解决方案1】:

    我遇到了同样的问题或错误,并在blog post 上找到了解决方案。

    您可以通过查看调试器堆栈跟踪来了解您所看到的是否与帖子中的问题相同。

    问题是由于 MapViewController(MKMapView 的父级)已被解除分配,并且 MKMapView 的异步地图获取内部试图调用 MKMapView(即 MapViewController)的委托。

    因此,在 MapViewController 的 dealloc 上,您必须重置 MKMapView.delegate = nil 以便在返回某些图块后不会调用任何委托。

    更新:在释放委托持有者之前,在 dealloc 中将委托归零是一种很好的做法(它在内存管理文档中的某处)。这将阻止长时间运行的异步任务发生此类问题。

    【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2011-01-07
    相关资源
    最近更新 更多