1

注釈付きの 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];
    }
}

これが行われていることです。

  1. ユーザーはリストから国を選択します。
  2. データベースから特定の国の座標を読み取ります。
  3. 選択した国の座標に基づいて、データベースからレコード (サイトの座標) を取得します。
  4. Map の各レコードに注釈を追加します。注:地図に表示する注釈は約 250 個あります

このコードは機能し、最初の読み込みで注釈を正しく表示しますが、別のサブビューに切り替えてこのサブビューに戻ると、次のメッセージでクラッシュします。

Terminating app due to uncaught exception of class '_NSZombie_NSException'
libc++abi.dylib: terminate called throwing an exception

値を変更して20個の注釈のみを表示しようとすると、機能し、クラッシュは発生しません。

問題は何ですか?これは非常に長い間私を悩ませています。

PS: 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]];
    }
}
4

2 に答える 2

2

コードにはいくつかの問題があります。ゾンビを直接生成するべきではありませんが、いくつか指摘します。

1

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

冗長な MKAnnotationView の作成を避けるために、reuseIdentifier を使用することをお勧めします。代わりに次のようにする必要があります。

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];

3

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

それは間違った方法です。新しいオブジェクトを初期化し、すぐに別のオブジェクトで上書きします。正しい方法は次のとおりです。

NSArray *site = [_siteList copy];

しかし、あなたのコードは非同期設定 _siteList を使用していないので、これも必要ありません。

site = _siteList; 

または、サイトの代わりに _siteList を使用します。

4 他にも多くのメモリ関連の問題がある場合は、ARC を使用してください。

于 2013-06-02T14:36:49.377 に答える
1

ゾンビが発生し、オブジェクトの参照カウントが 0 になり、インスタンス化せずにアクセスしようとしています。
MKMapView オブジェクトを親コントローラーのプロパティに配置して、サブビューとの切り替えによってライフサイクルが影響を受けないようにしてください。

于 2013-06-02T14:09:44.067 に答える