Quelle est la meilleure façon d'utiliser Obj-C 2.0 Properties avec des objets mutables, tels que NSMutableArray?

StackOverflow https://stackoverflow.com/questions/816720

Question

J'ai une classe Obj-C 2.0 qui a une propriété NSMutableArray. Si j’utilise le code suivant, le programmeur synthétisé me donnera une copie immuable, et non mutable:

@property (readwrite, copy) NSMutableArray *myArray;

Existe-t-il une quelconque raison pour laquelle Apple n'a pas mis en oeuvre la syntaxe suivante?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Etant donné que nous n'avons pas mutablecopy , quel est le meilleur moyen de gérer cette situation (apparemment courante)? Devrais-je juste écrire mon propre setter qui fait un -mutableCopy?

Était-ce utile?

La solution

Comme indiqué précédemment, la bonne façon de le faire n’est pas de transformer le tableau mutable en propriété. Il existe une bonne explication de ce que vous devez mettre en œuvre pour être conforme à KVC ici .

Autres conseils

J'ai rencontré le même problème il y a quelque temps et j'ai trouvé un document sur la connexion de développeur Apple recommandant de fournir votre propre implémentation du configurateur. Exemple de code dans le document lié:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

Il n’est pas courant de transmettre des NSMutableArray dans Cocoa. La pratique standard de Cocoa consistait à mettre en œuvre le code de conformité clé-valeur méthodes pour une propriété indexée vers plusieurs. Cela présente deux avantages:

  1. L'observation valeur-clé fonctionne comme prévu (dans plusieurs cas, l'observation d'un tableau NSMutableArray conduit à un comportement "pas ce que vous voulez")
  2. L'implémentation de votre structure de données est masquée car vous exposez des méthodes de mutation (par exemple, - [MyObject insertObjectInMyProperty: (id) newObject atIndex: (NSUInteger) i] , et non la structure de données elle-même.

N'oubliez pas que faire circuler un tableau mutable n'est pas une pratique courante dans Cocoa. Vous pouvez utiliser un tableau mutable privé comme stockage interne, mais créer des méthodes utilisant des objets NSArray simples pour en ajouter ou en extraire des objets. C’est peut-être pour cette raison qu’il n’ya pas de déclaration de propriété mutablecopy.

Vous devrez écrire votre propre compositeur.

La bonne façon de conserver un NSMutableArray est d'utiliser une propriété de retenue:

@property (nonatomic, retain) NSMutableArray *myArray;

Vous n'avez pas besoin d'écrire votre propre compositeur ni d'utiliser la copie. La propriété copy doit être utilisée avec un NSArray qui doit en fait être copié lorsque la propriété est capturée dans un autre objet. Par exemple, si vous affectez un objet NSMutableArray à une propriété de type NSArray avec la propriété copy, vous souhaitez créer une copie du tableau mutable dans le champ "capture". comme une propriété immuable à partir de ce moment.

Et Marc a la bonne approche: normalement, NSMutableArray ne ferait pas partie de l’API publique de vos objets. Si vous avez une propriété publique, ce peut être un NSArray avec la propriété copy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top