向地图添加多个注释时出现问题

时间:2009-08-17 17:49:35

标签: iphone objective-c mapkit

好的,所以我遇到了这个问题。我想要做的是手动添加多个注释到地图。当我只添加一个注释时,它可以完美地工作。引脚掉落,你可以点击它看它的标注,生活很好。

当我想添加多个时,问题出现了。当我添加第二个时,突然没有正确的颜色(即根据它们的大小,它们应该是某种颜色,但它们现在都是相同的......),更重要的是当你点击它们时,看到它们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个或两个引脚工作...

如果我甚至尝试在程序中手动只手动两个注释(即删除循环),它仍然会失败并且颜色仍然是错误的......

4 个答案:

答案 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。

希望这有帮助。

祝你好运! “

谢谢你们的帮助!你们都帮我了很多!