2011-09-20 3 views
0

De la documentation, la propriété MKMapView, Annotations, est un NSArray et non un NSMutableArray. Donc Annotations est censé être "immuable". Mais les méthodes instantanées de MKMapView: addAnnotation et removeAnnotation sont capables de changer le tableau Annotations. Donc, à première vue, il semble y avoir des incohérences. Il doit y avoir quelque chose que j'ai manqué. J'espère que quelqu'un de compétent pourrait éclairer cela.Une question à propos des annotations MKMapView

+0

Je ne pouvais pas voir des incohérences ou des contradictions. –

Répondre

0

Vous devez utiliser addAnnotation et removeAnnotation pour ajouter/supprimer des annotations au lieu de manipuler le tableau d'annotations directement.

Je suppose que ces deux fonctions effectuent un traitement ainsi que l'ajout/la suppression d'annotations du tableau.

+0

Merci pour la réponse, je me demandais si les appels d'ajout et de suppression remplaceraient en quelque sorte l'ancien tableau avec un nouveau. Comme vous le dites, nous sommes censés utiliser les méthodes données, le type assigné est de nous empêcher de faire quoi que ce soit directement. – Stanley

1

En déclarant la propriété annotations un NSArray, le code qui accède au tableau par cette propriété ne peut modifier en toute sécurité et doit le traiter comme un NSArray immuable. Cependant, cela ne signifie pas que le tableau lui-même est immuable.

Voici un exemple de la façon dont quelque chose comme cela pourrait fonctionner:

@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 

Dans cet exemple, vous pouvez voir que internalArrayRepresentation est un tableau mutable, et que son extérieur accessible MyObject comme immutableAccessor. Mais parce que la définition de la propriété indique que immutableAccessor est un NSArray, les appelants doivent le traiter de cette façon et ne peuvent pas le manipuler.

D'autres implémentations peuvent également y parvenir. La raison typique pour utiliser un pattern comme celui-ci est que vous voulez que MyObject maintienne le contrôle sur le contenu du tableau: peut-être que seulement certains objets peuvent être ajoutés, peut-être que les objets doivent être modifiés ou clonés, peut-être tout peut être ajouté mais rien ne peut être supprimé, etc.

+0

Merci pour votre réponse très détaillée. Il y a des modèles de code (tels que l'assignation dans la ligne "@sysnthesize") que je n'ai jamais vu auparavant. Mais ils doivent être des codes plus avancés que tout ce que j'ai pu rencontrer. Merci ... – Stanley