关于MKMapView注释的问题

时间:2011-09-20 15:38:42

标签: iphone cocoa-touch mkmapview

从文档中,MKMapView属性Annotations是NSArray而不是NSMutableArray。所以Annotations应该是“不可变的”。但MKMapView的即时方法:addAnnotation和removeAnnotation能够更改Annotations数组。所以从表面上看似乎存在一些不一致之处。必须有一些我错过的东西。希望知识渊博的人能够对此有所了解。

2 个答案:

答案 0 :(得分:1)

通过将annotations属性声明为NSArray,通过该属性访问数组的代码无法安全地修改它,并且必须将其视为不可变的NSArray 。但是,这并不意味着数组本身是不可变的。

这是一个类似这样的事情的例子:

@interface MyObject
{
   // instance variables
   NSMutableArray* internalArrayRepresentation;
}

// properties
@property (nonatomic, readonly) NSArray* immutableAccessor;

// methods
-(void)addItem:(NSObject*)object;

@end


@implementation MyObject

@synthesize immutableAccessor=internalArrayRepresentation;

-(id)init
{
   if ((self = [super init]))
   {
      // create the mutable array
      internalArrayRepresentation = [[NSMutableArray alloc] init]
   }
}

-(void)addItem:(NSObject*)object
{
    [internalArrayRepresentation addObject:object];
}

...

@end

在此示例中,您可以看到internalArrayRepresentation是一个可变数组,并且它可以在MyObject之外作为immutableAccessor访问。但由于属性定义表明immutableAccessorNSArray,因此调用者需要以这种方式对待它,并且无法对其进行操作。

还有其他实现可以实现这一目标。

使用这种模式的典型原因是因为您希望MyObject保持对数组内容的控制:可能只能添加某些对象,可能需要在路上修改或克隆对象in,也许任何东西都可以添加但是没有东西可以删除等等。

答案 1 :(得分:0)

您打算使用addAnnotationremoveAnnotation添加/删除注释,而不是直接操作注释数组。

我假设这些函数都进行了一些处理以及从数组中添加/删除注释。