1

我创建了以下方法来确定地图视图中我的注释的视图。

- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation
{

if ([annotation isKindOfClass:[MKUserLocation class]]) 
{
    return nil;
}

MKPinAnnotationView *pin;

if ([annotation isKindOfClass:[AnnotationsWithIndices class]])
{
int i = [(AnnotationsWithIndices *)annotation index];


if (i > currentCheckpointIndex ) 
{

    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"]; 
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"unvisited"];
    }
    [pin setPinColor:MKPinAnnotationColorRed]; 
}   

if (i == currentCheckpointIndex) 
{
    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"current"];
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"current"];
    }
    [pin setPinColor:MKPinAnnotationColorGreen]; 
}

if (i < currentCheckpointIndex) 
{
    pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"visited"]; 
    if (!pin) 
    {
        pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"visited"];
    }
    [pin setPinColor:MKPinAnnotationColorPurple];
}
[pin setAnimatesDrop:YES];
return [pin autorelease];
}
else
     return nil;
}

这个想法是我希望不同的注释视图(引脚)具有不同的颜色,具体取决于用户是否访问过它们以指示接下来要访问哪个注释。

这段代码工作正常,但我有几个问题希望有人能回答。

首先,MKPinAnnotations 从地图视图中取出并尽可能重用。在这样做的过程中(我在多个博客和论坛中找到了)

pin = (MKPinAnnotationView *)[mv dequeueReusableAnnotationViewWithIdentifier:@"unvisited"]; 

我知道返回值dequeueReusableAnnotationViewWithIdentifier:是 MKAnnotationView 的实例,而是pin指向 MKPinAnnotationView 实例的指针(它是 MKAnnotationView 的子类)。我想,这就是为什么(MKPinAnnotationView *)在方法调用前面有一个“强制转换”的原因。这真的是一个演员吗?在这种情况下,它是否不危险,因为 MKPinAnnotationView 包含更多的实例变量(比 MKAnnotationView),因此内存空间更大?

我试图找到一些关于此的信息,但我没有找到任何人特别解释这一点。

此外,指针注释要么属于 MKUserLocation 类,要么属于我自己的AnnotationsWithIndices符合 MKAnnotation 协议的自定义类。现在,为了确定注释视图应该具有哪种颜色,我在AnnotationsWithIndices类中添加了一个名为 index 的实例变量。现在,当我为我写的索引调用 getter 时

int i = [(AnnotationsWithIndices *)annotation index]; 

现在,我基本上对此有同样的疑问。这里是否进行了强制转换,或者只是为了让编译器知道可以将消息索引发送到注释?我猜编译器希望注解是一个 id,而它实际上是一个指向 AnnotationsWithIndices 实例的指针。当然,我知道是这种情况,因为注释将属于我的自定义类,并且我也明确地检查了这一点以确保。是否(AnnotationsWithIndices)只向编译器发出信号表明这没问题?

我也试图在没有运气的情况下找到有关此的信息。

我非常感谢您对此的任何回答。

4

0 回答 0