删除MKAnnotations时EXC_BAD_ACCESS

时间:2010-07-27 23:41:27

标签: iphone objective-c

我正在编写一个iPhone应用程序,用户应该能够打开并关闭地图上的所有引脚。要将所有引脚放在地图上,我使用:

-(void) putAllPins {
    for (id key in myDictionary) { //A NSDictionary
        NSArray *data = [myDictionary objectForKey:key];
        [self putPin: data];
    }
    isShowingAllPins = TRUE;
}

-(CLLocationCoordinate2D) putPin:(NSArray *) data {
    NSNumber *lat = [data objectAtIndex:0];
    NSNumber *lon = [data objectAtIndex:1];
    NSString *name = [data objectAtIndex:2];
    NSString *info = [data objectAtIndex:3];

    CLLocationCoordinate2D coords = {[lat doubleValue], [lon doubleValue]};
    MyMapAnnotation *annotation = [[MyMapAnnotation alloc] initWithCoordinate:coords andName:name andInformation:info];
    [_mapView addAnnotation:annotation];
    [annotation release];
    return coords;
}

要删除它们,我使用:

-(void) removeAllPins {
    NSMutableArray *toRemove = [NSMutableArray  arrayWithCapacity:([_mapView.annotations count] - 1)];
    for (id annotation in _mapView.annotations) {
        if (annotation != _mapView.userLocation) {
            [toRemove addObject:annotation];
        }
    }

    [_mapView removeAnnotations:toRemove];
}

一次移除所有引脚并再次添加它可以正常工作。但是一旦我第二次删除它们,我就会收到EXC_BAD_ACCESS错误。我已将问题跟踪到我的注释类中的dealloc方法,但仍然不知道该怎么做。任何帮助表示赞赏!

MyAnnotation.m:

@implementation MyAnnotation

@synthesize coordinate = _coordinate;

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate andName:(NSString *)name andInformation:(NSString *)info {
    self = [super init];
    _coordinate = coordinate;
    _name = name;
    _info = info;

    return self;
}

-(NSString *)title {
    return [NSString stringWithFormat:@"PREFIX %@", _name];
}

-(NSString *)subtitle {
    return _info;
}

- (void)dealloc {
    [_name release];
    [_info release];
    [super dealloc];
}

@end

2 个答案:

答案 0 :(得分:1)

在这里尝试提示#1

http://loufranco.com/blog/files/debugging-memory-iphone.html

您设置Xcode以便不会释放对象,并且如果您释放已释放的对象或以其他方式向他们发送消息,他们会抱怨。

更新:_name永远不会保留 - 然后你释放它。与_info相同。如果它们是保留属性,则需要使用self._name来使用生成的set消息(保留)

答案 1 :(得分:1)

[_mapView addAnnotation:annotation];
[annotation release];

不要发布“注释”,尝试它,也许可以解决你的问题。但我不知道如何以严谨的方式发布这个“注释”。如果我需要控制将来的anno,它可以不会被释放。那会导致泄密吗?我不知道。