从文档中,MKMapView属性Annotations是NSArray而不是NSMutableArray。所以Annotations应该是“不可变的”。但MKMapView的即时方法:addAnnotation和removeAnnotation能够更改Annotations数组。所以从表面上看似乎存在一些不一致之处。必须有一些我错过的东西。希望知识渊博的人能够对此有所了解。
答案 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
访问。但由于属性定义表明immutableAccessor
是NSArray
,因此调用者需要以这种方式对待它,并且无法对其进行操作。
还有其他实现可以实现这一目标。
使用这种模式的典型原因是因为您希望MyObject
保持对数组内容的控制:可能只能添加某些对象,可能需要在路上修改或克隆对象in,也许任何东西都可以添加但是没有东西可以删除等等。
答案 1 :(得分:0)
您打算使用addAnnotation
和removeAnnotation
添加/删除注释,而不是直接操作注释数组。
我假设这些函数都进行了一些处理以及从数组中添加/删除注释。