Ios MKMapView在重新加载时崩溃

Ios MKMapView在重新加载时崩溃,ios,objective-c,mkmapview,Ios,Objective C,Mkmapview,我正在使用带有注释的MKMapView 这是我的密码 -(void) addAnnotationForCountry { [self reloadSiteList]; [_compoundDetail.sidebar setUserInteractionEnabled:NO]; [_compoundDetail.detailWindow setUserInteractionEnabled:NO]; if (_diseaseTable.userInteraction

我正在使用带有注释的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];
    }
}
当我尝试更改该值以仅显示20个注释时,它可以工作,并且不会发生崩溃

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

附言:我不知道如何使用仪器进行内存管理。我试过了,但至今没有结果

任何形式的帮助都将不胜感激

谢谢

更新

-(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]];
    }
}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释{
MKAnnotationView*mapAnnotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation重用标识符:nil];
if([annotation isKindOfClass:[MKUserLocation类]]){
返回零;
}
mapAnnotationView.image=[UIImage ImageName:@“map_icon.png”];
返回mapAnnotationView;
}
-(无效)重新加载站点列表{
_siteList=[[NSMutableArray alloc]init];
_trialRefList=[[NSMutableArray alloc]init];
_trialRefList=[[PipelineDatabase initializeDatabase]getTrialReflistForDisease:\u selectedDisease];
对于(NSString*ref在_trialRefList中){
[_SiteListAddObjectsFromArray:[[PipelineDatabase initializeDatabase]getSitesByRef:ref]];
}
}

您得到了一个僵尸,您的对象被ref计数为0,然后您试图在不实例化它的情况下访问它。

尝试将MKMapView对象放入父控制器的属性中,这样它的生命周期就不会受到子视图切换的影响。

您的代码有几个问题。即使他们不应该直接制造僵尸,我也要向他们中的一些人指出:

一,

最好使用reuseIdentifier,以避免重复创建MKAnnotationView。您应该这样做:

static NSString *ident = @"siteAnnotation";
MKAnnotationView *mapAnnotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ident];
if (mapAnnotationView == nil)
     mapAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
2您只向映射添加注释,但使用
removeAnnotations:
方法删除注释似乎是合乎逻辑的,例如:

[mapView removeAnnotations:mapView.annotations];
三,

这是一种错误的方式。初始化一个新对象并立即用另一个对象覆盖它。正确的方法是:

NSArray *site = [_siteList copy];
但即使这样也没有必要,因为我看到您的代码没有使用异步设置_siteList,所以您可以使用

site = _siteList; 
或者使用_siteList而不是site


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

您还可以提供以下代码:
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释
和对于重新加载站点列表@ValeriiHiora添加了代码。让我尝试将MKMapView移动到父控制器,感谢您的建议。是的,我使用ARC,因为应用程序的BaseSDK是6.0。我做了您建议的所有更改,我尝试将MapViewController移动到父控制器,但僵尸仍然不断出现。
NSMutableArray *site = [[NSMutableArray alloc]init];
site = [_siteList copy];
NSArray *site = [_siteList copy];
site = _siteList;