2 votes

Comment vérifier l'affectation puisque addObject n'a pas accès au setter ?

Je viens de remarquer qu'appeler addObject: sur un NSMutableArray ne permet pas d'accéder au setter de ce tableau.

Par exemple, pour NSMutableArray self.myArray , [self.myArray addObject:object] n'utilise pas [self setMyArray:array] pour ajouter l'objet.

Auparavant, j'utilisais des setters et getter personnalisés pour vérifier l'affectation avant de l'effectuer ; par exemple, si je voulais un tableau qui n'accepte que les objets de la classe MyClass je ferais ce qui suit :

- (void)setMyArray:(NSMutableArray *)myArray
{
    for (id object in myArray)
    {
        if (![object isKindOfClass:[MyClass class]]) return;
    }
    _myArray = myArray;
}

- (NSMutableArray *)myArray
{
    if (!_myArray) _myArray = [[NSMutableArray alloc] init];
    _myArray = myArray;
}

Comment puis-je réaliser cette même fonctionnalité en changeant le tableau via addObject: , removeObject: et d'autres fonctions similaires qui peuvent contourner le setter ?

3voto

Abhi Beckert Points 10768

Généralement, ce genre de problème est la raison pour laquelle NSMutableArray est généralement évité et remplacé par NSArray .

C'est la solution simple, utiliser NSArray au lieu de NSMutableArray :

self.myArray = [self.myArray arrayByAddingObject:foo];

Cependant, si la matrice est très grande, cela posera des problèmes de performance. Alors vous avez deux options :

  • vous pouvez avoir votre propre addObjectToMyArray: dans votre classe et utilisez toujours cette méthode
  • vous pouvez créer un NSArrayController et l'utiliser pour accéder à votre tableau. Il implémentera l'observation de la clé et de la valeur, les liaisons et toutes ces choses.

NSMutableArray est conçu pour réaliser addObject: avec aussi peu d'instructions CPU que possible et ne prouve donc aucun moyen pour le code externe d'être informé que l'objet a été ajouté. Il faut qu'une autre classe l'entoure.

N'essayez pas de sous-classer NSMutableArray car il s'agit d'un "groupe de classes" qui rend les sous-classes extrêmement compliquées.

0voto

CRD Points 21578

Si ce que vous souhaitez faire est de vous assurer que les objets du tableau sont d'une classe particulière alors cette réponse à la question "NSMutableArray - force the array to hold specific object type only" fournit le code pour faire exactement cela.

Si vous souhaitez effectuer d'autres contrôles sur l'affectation, vous pouvez utiliser le code de cette réponse comme point de départ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X