addAnnotations问题(内存管理可能?)

Viv*_*ivi 1 iphone objective-c mapkit

我在使用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"); }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我在地图上显示任何内容之前得到"添加地标:完成"消息.

CVe*_*tex 5

我遇到了同样的问题或bug,并在博客文章中找到了解决方案.

通过查看调试器堆栈跟踪,您可以查看您所看到的内容是否与帖子中的问题相同.

问题是由于MapViewController(MKMapView的父级)已被解除分类,并且获取MKMapView内部的异步映射试图调用MKMapView的委托(这是MapViewController).

因此,在MapallController的dealloc上,你必须重置MKMapView.delegate = nil,以便在返回一些tile之后不会调用任何委托.

更新:在释放委托持有者之前,在dealloc中为代理人提供ns代理的好习惯(在内存管理文档中的某个地方).对于长时间运行的异步任务,这将阻止这样的问题发生.