我在使用MKMapView / annotations / UINavigationController时遇到了一些问题。基本上,我使用UINavigationController管理我的视图;我的一个视图包含一个MKMapView,我使用addAnnotations方法在其上添加注释(10到200)。
除了一件事,一切正常:如果我在我的UINavigationController上导航“太快”,iphone模拟器崩溃,接收“EXC BAD ACCESS”信号。例如,如果我加载包含MKMapView的视图,并立即按下UINavigationController导航栏中的“返回”按钮,我会收到信号。我认为问题出在addAnnotations方法上:加载我的MKMapView时,我会向它添加注释,但看起来所有内容都是异步完成的。如果我在按下“返回”按钮之前等待一秒钟,我没有错误,但如果我太快,它会崩溃。如果删除addAnnotations行,我根本没有错误。我想这是因为我的视图是由UINavigationController在addAnnotations方法完成工作之前发布的。
对此有什么好的解决方案吗?我不希望用户等待(例如显示加载视图);我想解决方案可能是一个更好的内存管理,但我不知道我怎么能这样做。
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"); }
在这个例子中,我在地图上显示任何内容之前收到“添加地标:完成”消息。
答案 0 :(得分:5)
我遇到了同样的问题或错误,并在blog post找到了解决方案。
通过查看调试器堆栈跟踪,您可以查看您所看到的内容是否与帖子中的问题相同。
问题是由于MapViewController(MKMapView的父级)已被解除分类,并且获取MKMapView内部的异步地图试图调用MKMapView的委托(即MapViewController)。
因此,在MapallController的dealloc中,你必须重置MKMapView.delegate = nil,以便在返回一些tile后不会调用任何委托。
更新:在释放委托持有者之前,在dealloc中为代理人提供ns代理人是好的做法(在内存管理文档中的某个地方)。这将阻止长时间运行异步任务的问题。