EXC_BAD_ACCESS с MKPinAnnotationView - PullRequest
       22

EXC_BAD_ACCESS с MKPinAnnotationView

3 голосов
/ 24 марта 2011

У меня проблема с отображением моего MKPinAnnotationView на mapView в iOS.Я получаю эту ошибку, но я не понимаю, откуда возникла ошибка: «EXC_BAD_ACCESS».Мой код кажется хорошим:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

MKPinAnnotationView *pv = [[MKPinAnnotationView alloc] init];
[pv setPinColor:MKPinAnnotationColorGreen];
[pv setCanShowCallout:YES];
[pv setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];

return pv;

}

Когда я устанавливаю точки останова для приложения, вот мой дисплей консоли, используя gdb:

    continue
Current language:  auto; currently objective-c
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x023d1dfe in -[MKPinAnnotationView _setPinType:] ()
#1  0x0000324c in -[iSouvenirView mapView:viewForAnnotation:] (self=0x761abe0, _cmd=0x24221fd, mapView=0x7613410, annotation=0x761d360) at /Users/m2sar/iSouvenir/iSouvenirView.m:125
#2  0x02398130 in -[MKAnnotationContainerView _addViewForAnnotation:] ()
#3  0x02392b2a in -[MKAnnotationContainerView _addViewsForAnnotations:animated:] ()
#4  0x0238e657 in -[MKAnnotationContainerView showAddedAnnotationsAnimated:] ()
#5  0x0236837c in -[MKMapView _showAddedAnnotationsAndRouteAnimated:] ()
#6  0x02367cc8 in -[MKMapView mapTileViewDidFinishRendering:] ()
#7  0x023e7ae0 in -[MKMapTileView _didFinishRendering] ()
#8  0x000471c9 in __NSFireTimer ()
#9  0x025cff73 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#10 0x025d15b4 in __CFRunLoopDoTimer ()
#11 0x0252ddd9 in __CFRunLoopRun ()
#12 0x0252d350 in CFRunLoopRunSpecific ()
#13 0x0252d271 in CFRunLoopRunInMode ()
#14 0x0326000c in GSEventRunModal ()
#15 0x032600d1 in GSEventRun ()
#16 0x002bfaf2 in UIApplicationMain ()
#17 0x00002388 in main (argc=1, argv=0xbffff070) at /Users/m2sar/iSouvenir/main.m:14
(gdb)

Ошибка ввторая строка кода.Любое предложение?

Спасибо за вашу помощь

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Вы должны запустить просмотр аннотации, используя initWithAnnotation:reuseIdentifier:.Например:

MKPinAnnotationView *pv = [[[MKPinAnnotationView alloc] 
    initWithAnnotation:annotation reuseIdentifier:@"annot"] autorelease];

Однако вы также должны воспользоваться возможностью повторного использования представления аннотации, сначала позвонив dequeueReusableAnnotationViewWithIdentifier.

Редактировать:
В документы для MKAnnotationView , параграф, озаглавленный «Повторное использование представлений аннотаций», объясняет, почему вы должны использовать dequeueReusableAnnotationViewWithIdentifier.Таким образом, код для viewForAnnotation будет выглядеть так:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{
    static NSString *myAnnotationIdentifier = @"annot";

    MKPinAnnotationView *pv = (MKPinAnnotationView *)[mapView 
        dequeueReusableAnnotationViewWithIdentifier:myAnnotationIdentifier];
    if (!pv)
    {
        pv = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                reuseIdentifier:myAnnotationIdentifier] autorelease];
        [pv setPinColor:MKPinAnnotationColorGreen];
        [pv setCanShowCallout:YES];
        [pv setRightCalloutAccessoryView:[UIButton buttonWithType:UIButtonTypeDetailDisclosure]];
    }
    else
    {
        //we're re-using an annotation view
        //update annotation property in case re-used view was for another  
        pv.annotation = annotation;
    }

    return pv;
}
1 голос
/ 24 марта 2011

Попробуйте:

MKPinAnnotationView *pv = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
...