Objective c MKMapKit-循环通过Mkmapotation时EXC_错误访问

Objective c MKMapKit-循环通过Mkmapotation时EXC_错误访问,objective-c,ios,ios4,mkmapview,mkannotation,Objective C,Ios,Ios4,Mkmapview,Mkannotation,我已经被困在这个EXC_BAD_访问错误上两天了。我有一个reloadAnnotations方法,在添加新注释之前删除所有注释。在删除注释之前,此方法应检查新集合是否包含相同的位置,以便不删除并重新添加。但当我试图找出当前的注释标题时,我得到了这个错误线程1:程序收到信号:“EXC\u BAD\u ACCESS” 当我在调试器中查看注释时,title属性显示“Invalid Summary”。这一定是因为某个值没有被保留,但我已经尝试了所有的方法,但无法找到它 为什么我不能将注释标题记录到NSL

我已经被困在这个EXC_BAD_访问错误上两天了。我有一个
reloadAnnotations
方法,在添加新注释之前删除所有注释。在删除注释之前,此方法应检查新集合是否包含相同的位置,以便不删除并重新添加。但当我试图找出当前的注释标题时,我得到了这个错误
线程1:程序收到信号:“EXC\u BAD\u ACCESS”

当我在调试器中查看注释时,title属性显示“Invalid Summary”。这一定是因为某个值没有被保留,但我已经尝试了所有的方法,但无法找到它

为什么我不能将注释标题记录到NSLog?

为什么我不能将每个标题和坐标与其他对象进行比较?

BrowseController.m

-(void)reloadAnnotations
{
    NSMutableArray *toRemove = [NSMutableArray arrayWithCapacity:10];
    for (id annotation in _mapView.annotations) {
        if (annotation != _mapView.userLocation) {
            //ParkAnnotation *pa = (ParkAnnotation *)annotation;
            ParkAnnotation *pa = annotation;
            NSLog(@"pa.title %@", pa.title); // Thread 1: Program received signal: "EXC_BAD_ACCESS"
            [toRemove addObject:annotation];
        }
    }
    // DON'T REMOVE IT IF IT'S ALREADY ON THE MAP!!!!!! 
    for(RKLocation *loc in locations) 
    {
        CLLocationCoordinate2D location;
        location.latitude = (double)[loc.lat doubleValue];
        location.longitude = (double)[loc.lng doubleValue];
        ParkAnnotation *parkAnnotation = [[ParkAnnotation alloc] initWithTitle:loc.name andCoordinate:location];      
        [_mapView addAnnotation:parkAnnotation];
    }
    [_mapView removeAnnotations:toRemove];
}



- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
    NSLog(@"BrowseViewController map viewForAnnotation");
    MKPinAnnotationView *pin = (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier: @"anIdentifier"];

    if (pin == nil){
        pin = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                               reuseIdentifier: @"anIdentifier"] autorelease];

        pin.pinColor = MKPinAnnotationColorRed;
        pin.animatesDrop = YES;
        pin.canShowCallout = YES;
    }
    else{
        pin.annotation = annotation;
    }
    return pin;
    }

尽管您已声明
title
具有
copy
type属性,但它永远不会被复制,因为您不使用setter方法并直接指定。你甚至在没有所有权的情况下发布它。像这样改变它

title = [ttl copy];

ParkAnnotation.m中的初始值设定项不是按照ObjC约定编写的。如果从未设置自变量,则类的指定初始值设定项应遵循以下模式:

- (id)init 
{
    self = [super init]; 
    if (self) 
    { 
        /* custom initialization here ... */ 
    } 
    return self;
} 

由于未设置self,调用程序中使用的访问器方法将失败;当试图从另一个类访问对象内部的属性时,容器对象(在self中引用的parkanotation.m内部)将为零或某些伪值。

您可能无法比较注释本身,因为它们可能是指向不同对象的指针,因此永远不会相等。您可以尝试比较指针内的实际值。是否可以显示mapview的annotations属性?如何为这个属性赋值,是使用getter和setter还是直接访问属性值?属性是否复制或保留其值?@Wolfgang我打算比较注释标题和not MKAnnotation对象。好的,我发现了问题!问题A就像你说的设置自变量。问题B是更改标题=ttl;to self.title=ttl@Wolfgang将您的修复添加到下面的答案中,我将为您检查。更好的方法是使用属性而不是变量。它将变成“self.title=ttl;”。人们总是倾向于使用属性而不是变量来避免内存问题。我总是以u开头变量名,以防止出现此类问题。在前面的评论中,我提到了这个问题,jspooner相应地修改了他的代码。他让我加上这个作为回答,他会投赞成票,因为这帮助他解决了问题。我看着这段代码,想知道为什么不能设置self。至于他早期的代码,除了一些罕见的情况外,它还能工作<代码>self在alloc完成后立即设置,并且
[super init]
主要影响相同的内存块。我们执行
self=[super init]
以确保超类的init方法不会返回与我们在单例中分配的方法不同的结果。因此,应该在
if
语句中检查赋值是否失败,因为我们不想在不同的对象上调用
self.*
方法。
title = [ttl copy];
- (id)init 
{
    self = [super init]; 
    if (self) 
    { 
        /* custom initialization here ... */ 
    } 
    return self;
}