好的,所以我遇到了这个问题。我想要做的是手动添加多个注释到地图。当我只添加一个注释时,它可以完美地工作。引脚掉落,你可以点击它看它的标注,生活很好。
当我想添加多个时,问题出现了。当我添加第二个时,突然没有正确的颜色(即根据它们的大小,它们应该是某种颜色,但它们现在都是相同的......),更重要的是当你点击它们时,看到它们callout,应用程序崩溃与exex_bad_access。我真的不知道出了什么问题,也许我在地图上添加了太多的观点?但它只有9个引脚,而引脚本身也很好。 这是我的代码......
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *stops = [[NSMutableArray alloc] init]; //Get list of all the stops available
Bus *bus1 = [[Bus alloc] init]; // Bus 1 holds the stops
stops = [bus1 returnStops];
for (NSString *stop in stops) //Go through each stop to add annotation to map
{
Bus *bus2 = [bus1 initWithStop:stop]; //Create an instance of bus with a given stop
MapAnnotation *eqAnn = [MapAnnotation annotationWithBus:bus2];
[self.mapView addAnnotation:eqAnn]; //Add the annotation to the map
//[eqAnn release];
//[bus2 release];
}
[self recenterMap];
[stops release];
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation {
MKAnnotationView *view = nil;
if(annotation != mapView.userLocation) {
MapAnnotation *eqAnn = (MapAnnotation*)annotation;
view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"busLoc"];
if(nil == view) {
view = [[[MKPinAnnotationView alloc] initWithAnnotation:eqAnn
reuseIdentifier:@"busLoc"] autorelease];
}
CGFloat magnituide = [eqAnn.bus.magnitude floatValue];
if(magnituide >= .80f) {
[(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorRed];
} else if(magnituide >= .60f) {
[(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorPurple];
} else
{
[(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorGreen];
}
[(MKPinAnnotationView *)view setAnimatesDrop:YES];
[view setCanShowCallout:YES];
}
return view;
}
甚至尝试删除第二个功能,但它没有做任何事情。
感谢您的帮助! P.S我还应该补充一点,当您单击注释时,通常会有9个或两个引脚工作...
如果我甚至尝试在程序中手动只手动两个注释(即删除循环),它仍然会失败并且颜色仍然是错误的......
答案 0 :(得分:1)
stops
变量的内存管理似乎不正确。您分配一个可变数组,然后用返回值-[Bus returnStops]
替换该数组,然后释放它。还不清楚bus2
发生了什么 - -[Bus initWithStop:]
是否会返回不同的 Bus
实例?在已初始化的对象上发送任何方法-init*
并不常见。我认为您可能对Cocoa Touch中的内存管理约定感到困惑。这是一组文章和其他参考文献on Cocoa memory management(这是相同的野兽)。
答案 1 :(得分:0)
您是否尝试过使用AddAnnotations而不是添加注释? - (void)addAnnotations:(NSArray *)注释。这可能对你有用......但是看看上面的答案并进一步检查你在viewDidLoad中有一些内存管理问题(尽管这可能不是你问题的原因,但它可能是)。首先是分配数组(停止),然后在Bus对象中使用某个数组将其终止,这将导致泄漏。此外,您正在释放可能导致崩溃的数组,因为您释放实际位于Bus对象中的数组,而不会增加对它的引用计数。我不确定initWithStop正在做什么,但如果initWithStop保留了对象,你也可能在这里遇到泄漏。
答案 2 :(得分:0)
我不会把它称为内存管理问题 - 我只是说你错误地使用数组引用。
使用NSMutableArray * stops = [[NSMutableArray alloc] init]构造数组后,下一步是使用[stops addObject:]添加要存储的每个句点。
之后呢?目前尚不清楚你真正想做什么。
答案 3 :(得分:0)
所以答案是我一直向bus1发送init对象,所以很困惑。
<嗨大卫,您的数据模型看起来像我一样。您只有一个总线对象,您反复发送initWithStop:to。
希望这有帮助。
祝你好运! “谢谢你们的帮助!你们都帮我了很多!