1

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

当我想添加多个时,问题就来了。当我添加第二个时,突然引脚的颜色不正确(即根据它们的大小,它们应该是某种颜色,但它们现在都是相同的......),更重要的是,当你点击它们时,看到它们标注时,应用程序因 exex_bad_access 而崩溃。我真的不知道出了什么问题,也许我在地图上添加了太多视图?但它只有 9 个引脚,引脚本身添加得很好。这是我的代码……</p>

    - (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;
}

甚至尝试删除第二个功能,但它没有做任何事情。

谢谢您的帮助!PS我还应该补充一点,当您单击注释时,通常会有 9 个引脚中的一两个引脚起作用……</p>

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

4

4 回答 4

1

您对变量的内存管理似乎stops不正确。您分配一个可变数组,然后将该数组替换为 的返回值-[Bus returnStops],然后释放它。此外,目前还不清楚发生了什么bus2- 是否-[Bus initWithStop:]返回不同的实例Bus-init*在已经初始化的对象上发送任何方法是不常见的。我认为您可能对 Cocoa Touch 中的内存管理约定感到困惑。这是关于 Cocoa 内存管理的文章和其他参考资料的集合(这是同一个野兽)。

于 2009-08-17T17:55:58.933 回答
0

我不会将其称为内存管理问题——我只是说您错误地使用了数组引用。

使用 NSMutableArray *stops = [[NSMutableArray alloc] init] 构造数组后,下一步是使用 [stops addObject: ] 添加要存储的每个停靠点。

在那之后?目前尚不清楚您真正想要做什么。

于 2009-08-17T18:34:15.860 回答
0

所以答案是我一直向 bus1 发送 init 对象,所以它很困惑。

“嗨,大卫,

你的数据模型对我来说看起来很糟糕。您只有一个要反复发送 initWithStop: 的总线对象。

希望这可以帮助。

祝你好运!"

谢谢你们的帮助!你们都帮了我不少忙!

于 2009-08-17T19:02:01.607 回答
0

您是否尝试过使用 AddAnnotations 而不是添加注释?- (void)addAnnotations:(NSArray *)注解。这可能对您有用...但是查看上面的答案并进一步检查您的 viewDidLoad 中存在一些内存管理问题(尽管这可能不是您的问题的原因,但它可能是)。首先,您分配数组(停止),然后使用 Bus 对象中的某个数组对其进行过度验证,这将导致泄漏。此外,您还释放了可能导致崩溃的数组,因为您释放了实际位于 Bus 对象中的数组,而没有增加对它的引用计数。我不确定 initWithStop 正在做什么,但如果 initWithStop 保留该对象,您也可能在这里遇到泄漏。

于 2009-08-17T17:56:18.963 回答