Ios MKMapView在重新加载时崩溃
我正在使用带有注释的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
-(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;