gpt4 book ai didi

ios - MKMapView在重新加载时崩溃

转载 作者:行者123 更新时间:2023-12-01 19:10:28 25 4
gpt4 key购买 nike

我正在使用带有注释的MKMapView。

这是我的代码。

-(void) addAnnotationForCountry {
[self reloadSiteList];
[_compoundDetail.sidebar setUserInteractionEnabled:NO];
[_compoundDetail.detailWindow setUserInteractionEnabled:NO];
if (_diseaseTable.userInteractionEnabled) {
[_diseaseTable setUserInteractionEnabled:NO];
_sitecount = 0;
_radius = 0;
NSMutableArray *site = [[NSMutableArray alloc]init];
site = [_siteList copy];
for (Site *s in site) {
if ([s.country isEqualToString:selectedCountry.country] && _sitecount < 20) {
MKPointAnnotation *annot = [[MKPointAnnotation alloc] init];
annot.title = [s city];
annot.coordinate = CLLocationCoordinate2DMake(s.lat, s.log);
[_mapView addAnnotation:annot];
_sitecount++;
}
}
if (!_sitecount) {
[self showNoSiteAvailbleView];
_radius = 500;
}
if (_sitecount && _radius < 100) {
_radius = 100;
}
MKCoordinateSpan span;
span.latitudeDelta = 100;
span.longitudeDelta = 100;
MKCoordinateRegion region;
region.span = span;
region.center = CLLocationCoordinate2DMake(selectedCountry.lat, selectedCountry.log);
[_mapView setRegion:region animated:YES];
}
}

这是正在做的。
  • 用户从列表中选择国家。
  • 从数据库中读取特定国家的坐标。
  • 基于所选的国家/地区坐标,从数据库中获取记录(站点坐标)。
  • 为Map中的每个记录添加注释。
    注意:我大约有250个注释要显示在 map


  • 这段代码可以在第一次加载时正常工作并正确显示注释,但是当我切换到另一个SubView并返回此SubView时,它崩溃并显示以下消息。
    Terminating app due to uncaught exception of class '_NSZombie_NSException'
    libc++abi.dylib: terminate called throwing an exception

    当我尝试将值更改为仅显示20条注释时,它将起作用,并且不会发生崩溃。

    可能是什么问题 ?很长一段时间以来,这一直困扰着我。

    附注:我不知道使用Instruments进行内存管理。我尝试过,但到目前为止没有任何结果。

    任何帮助将不胜感激。

    谢谢

    更新
    -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    MKAnnotationView *mapAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
    return nil;
    }
    mapAnnotationView.image = [UIImage imageNamed:@"map_icon.png"];
    return mapAnnotationView;
    }

    -(void)reloadSiteList {
    _siteList = [[NSMutableArray alloc]init];
    _trialRefList = [[NSMutableArray alloc] init];
    _trialRefList = [[PipelineDatabase initializeDatabase] getTrialReflistForDisease:_selectedDisease];
    for (NSString *ref in _trialRefList) {
    [_siteList addObjectsFromArray:[[PipelineDatabase initializeDatabase] getSitesByRef:ref]];
    }
    }

    最佳答案

    您的代码有几个问题。即使它们不应该直接产生僵尸,我也要指出其中一些:

    1个

    MKAnnotationView *mapAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];

    您最好使用redirectIdentifier来避免创建冗余的MKAnnotationView。您应该改为执行以下操作:
    static NSString *ident = @"siteAnnotation";
    MKAnnotationView *mapAnnotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ident];
    if (mapAnnotationView == nil)
    mapAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];

    2您仅向 map 添加了注释,但是使用 removeAnnotations:方法删除它们似乎是合乎逻辑的:
    [mapView removeAnnotations:mapView.annotations];

    3
    NSMutableArray *site = [[NSMutableArray alloc]init];
    site = [_siteList copy];

    这是错误的方式。您初始化一个新对象,然后立即用另一个对象覆盖它。正确的方法是:
    NSArray *site = [_siteList copy];

    但这并不是必须的,因为我看到您的代码未使用异步设置_siteList,因此您可以使用
    site = _siteList; 

    或曾经使用_siteList代替site。

    4我希望您在其他情况下使用ARC时,还有许多其他与内存相关的问题

    关于ios - MKMapView在重新加载时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883382/

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