2011-08-12 3 views
0

私は多分5つの注釈(現在は)でMKMapviewを読み込んでいます。アノテーションも正しくロードされます。各注釈には、正しい左右の吹き出しが含まれています。しかし、しばらく(多分2分)私は、多くの場合、EXC_BAD_ACCESSのクラッシュを取得し、注釈の左側コールアウトの...iphone mkannotation:地図がロードされた後、左の吹き出しに関する警告

- (MKAnnotationView *) mapView:(MKMapView *)thisMapView 
     viewForAnnotation:(MapAnnotations *)annotation 
{ 
static NSString *MapIdentifier = @"MapIdentifier"; 

UIImageView *myImageView; 
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView dequeueReusableAnnotationViewWithIdentifier:MapIdentifier]; 

if(annotationView == nil) 
{ 
    NSString * id = [NSString stringWithFormat:@"%d", (annotation).tag]; 
    NSString * postPhoto = [NSString stringWithFormat:@"id=%@",id]; 
    NSString * hostStrPhoto = @"http://domain.com/get_image.php?"; 
    hostStrPhoto = [hostStrPhoto stringByAppendingString:postPhoto]; 

    NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:hostStrPhoto]]; 

    myImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData: imgData]]; 

    myImageView.frame = CGRectMake(0,0,31,31); 

    annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MapIdentifier] autorelease]; 

} 

annotationView.animatesDrop=TRUE; 


annotationView.canShowCallout = YES; 
annotationView.leftCalloutAccessoryView = myImageView; //<--where I am getting the error, after all the annotations have loaded. 
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 

return annotationView; 

[myImageView autorelease]; 

}

後、私は多分、私のアプリはまだ注釈をロードしようとしている考えていますしかし、私は理由を理解できません。同様に地図がロードされているときにいくつかのメモリ警告が表示されるため、おそらく私はいくつかのオブジェクトをリリースしていないでしょう、私はメモリ管理の仕組みにまだまだ新しいことがあるので、

答えて

1

注釈ビューを再利用すると、myImageViewは作成されずに解放されます。 myImageViewをnilに設定します。

- (MKAnnotationView *) mapView:(MKMapView *)thisMapView viewForAnnotation:(MapAnnotations *)annotation { 
    static NSString *MapIdentifier = @"MapIdentifier"; 

    UIImageView *myImageView = nil; 
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView dequeueReusableAnnotationViewWithIdentifier:MapIdentifier]; 

    if(annotationView == nil) { 
     NSString * id = [NSString stringWithFormat:@"%d", (annotation).tag]; 
     NSString * postPhoto = [NSString stringWithFormat:@"id=%@",id]; 
     NSString * hostStrPhoto = @"http://domain.com/get_image.php?"; 
     hostStrPhoto = [hostStrPhoto stringByAppendingString:postPhoto]; 

     NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:hostStrPhoto]]; 

     myImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData: imgData]]; 

     myImageView.frame = CGRectMake(0,0,31,31); 

     annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MapIdentifier] autorelease]; 
    } 

    annotationView.animatesDrop=TRUE; 
    annotationView.canShowCallout = YES; 
    annotationView.leftCalloutAccessoryView = myImageView; //<--where I am getting the  error, after all the annotations have loaded. 
    annotationView.rightCalloutAccessoryView = [UIButton  buttonWithType:UIButtonTypeDetailDisclosure]; 

    return annotationView; 

    [myImageView release]; 
} 
+0

これは現在かなりうまく機能しています。これまでのところクラッシュしない:) – amanda

関連する問題