我正在编写一个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
答案 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,它可以不会被释放。那会导致泄密吗?我不知道。