gpt4 book ai didi

ios - MKMapView annotationContainer :viewForAnnotation 中持续崩溃

转载 作者:可可西里 更新时间:2023-11-01 06:20:23 26 4
gpt4 key购买 nike

我看过其他关于此的报告,但似乎没有一个适用。我们的应用程序因频繁(但无法可靠地重现)崩溃而瘫痪,如下所示:

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x333a6c98 objc_msgSend + 16
1 MapKit 0x30be52fc -[MKMapView annotationContainer:viewForAnnotation:] + 36
2 MapKit 0x30be4f8e -[MKAnnotationContainerView _addViewForAnnotation:] + 270
3 MapKit 0x30c0f164 -[MKAnnotationContainerView addViewForManagedAnnotation:notifyDelegate:] + 12
4 MapKit 0x30c0b874 -[MKMapView(UserPositioningInternal) _runPositioningChange] + 1036
5 MapKit 0x30c09a86 -[MKMapView(UserPositioningInternal) _startPositioningChange:] + 22
6 MapKit 0x30c0d04a -[MKMapView(UserPositioningInternal) locationManagerUpdatedLocation:] + 578
7 CoreFoundation 0x360bcefc -[NSObject(NSObject) performSelector:withObject:] + 16
8 CoreFoundation 0x360fa2f2 -[NSArray makeObjectsPerformSelector:withObject:] + 394
9 MapKit 0x30bfc802 -[MKLocationManager _reportLocationStatus:] + 34
10 MapKit 0x30bfdd6c -[MKLocationManager _reportLocationSuccess] + 36
11 MapKit 0x30bfd9c6 -[MKLocationManager locationManager:didUpdateToLocation:fromLocation:] + 674

关于这方面的报道在网络上出现了很多,但很多似乎都没有得到解决。我没有做任何疯狂的事情,只是在 map 上显示用户位置和一个标记。我遵循了我能找到的示例,并且查看了错误代码但找不到任何错误。

这是我的 MapView 委托(delegate)处理 viewForAnnotation 的方式:

- (MKAnnotationView*)mapView:(MKMapView*)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// If it's the user location, just return nil.
if([annotation isKindOfClass:[MKUserLocation class]])
{
return nil; // Use default system user-location view.
}
else
{
// Try to dequeue an existing pin view first.
MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"stashMarkerID"];
if(!pinView)
{
// If an existing pin view was not available, create one.
pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"stashMarkerID"] autorelease];
pinView.pinColor = MKPinAnnotationColorPurple;
pinView.animatesDrop = YES;
pinView.canShowCallout = NO;
}
else
{
pinView.annotation = annotation;
}

return pinView;
}
}

崩溃似乎与用户位置的变化有关,但一旦添加了用户位置标记,我就不会再惹它了。当我需要刷新另一个 map 标记时,我会在删除另一个 map 标记时跳过用户标记:

// Add the marker to the map.
// Remove old one(s) first.
int i = 0;
while(i < [mapView.annotations count])
{
if ([[mapView.annotations objectAtIndex:i] isKindOfClass:[StashMarker class]])
{
[mapView removeAnnotation:[mapView.annotations objectAtIndex:i]];
}
else
{
i++;
}
}

委托(delegate)是整个屏幕的 Controller ,因此不会被释放;屏幕亮起时发生崩溃。这并不重要,但 map 显示如下所示:

enter image description here

任何猜测或见解将不胜感激!这是在 iOS 5.0.1 上。

更新:我们发现当根本不应该存在 MKMapView 时会发生此崩溃。包含它的 View 早已被弹出。我想知道我们是否遇到此处报告的问题:MKMapView crashes app when view controller popped

更新 2:这是本质上相同的另一份报告:Why am I crashing after MKMapView is freed if I'm no longer using it?

这对于 Cocoa 来说似乎异常困惑,在我们期望 MapView 被释放之后必须将 MKMapView 的委托(delegate)设置为 nil。按照这种速度,为什么我们不必对所有接受委托(delegate)的控件都这样做?

最佳答案

好的,这才是真正的答案。它来自 Apple 文档,但在 MKMapView 中缺失。它只能在其委托(delegate)协议(protocol)的文档中找到:

“在释放已为其设置委托(delegate)的 MKMapView 对象之前,请记住将该对象的委托(delegate)属性设置为 nil。您可以在释放 map View 的 dealloc 方法中执行此操作。”

注意:这也适用于 UIWebView。

我在delegate的dealloc方法中设置了MapView的delegate指针为nil,我们的crash好像已经消除了。

关于ios - MKMapView annotationContainer :viewForAnnotation 中持续崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com