2011-09-20 92 views
0

從文檔中,MKMapView屬性Annotations是NSArray而不是NSMutableArray。所以註釋應該是「不可變的」。但是MKMapView的即時方法:addAnnotation和removeAnnotation能夠改變Annotations數組。所以表面上似乎存在一些不一致之處。肯定有一些我錯過了。希望有人知道可以對此有所瞭解。關於MKMapView註解的問題

+0

我看不到矛盾或矛盾。 –

回答

0

您打算使用addAnnotationremoveAnnotation添加/刪除註釋,而不是直接操縱註釋數組。

我假設這些功能都做了一些處理,以及從數組中添加/刪除註釋。

+0

感謝您的答案,我只是想知道添加和刪除調用會以某種方式替換舊的數組。正如你所說,我們打算使用給定的方法,分配的類型是爲了防止我們直接做任何事情。 – Stanley

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保持對數組內容的控制:也許只有某些對象可以被添加,也許對象需要修改或克隆,任何東西都可以添加,但沒有東西可以刪除等。

+0

感謝您的詳細解答。代碼模式(例如「@sysnthesize」行中的賦值)是我以前從未見過的。但它們必須是比我遇到的更先進的代碼。謝謝 ... – Stanley