0 votes

PerformSelector pour des éléments hétérogènes dans un tableau provoquant une NSInvalidArgumentException

Mon NSArray contient deux types de classes différents, qui dérivent tous deux de NSObject et ont une méthode avec le même nom. Si j'appelle :

[myArrayList 
      makeObjectsPerformSelector:@selector(dehydrate) 
      withObject:myParamObjec];

Je reçois l'exception 'sélecteur non reconnu' :

exception non capturée 'NSInvalidArgumentException', raison : '*** -[BlankItem dehydrate]: sélecteur non reconnu envoyé à l'instance 0x10328e0'

Si j'itére à travers chaque élément de 'myArrayList' et invoque manuellement 'hydrate' sur BlankItem en tant que sélecteur, même chose mais si je fais le cast correctement, tout va bien.

for (id item in myArray)
{
    if ([item isKindOfClass:[BlankItem class]])
    {
        BlankItem *blankItem = (BlankItem *)item;

        // cela fonctionne
        [blankItem dehydrate:connectionFactory];

        // cela produit l'exception
        [item performSelector:@selector(dehydrate) withObject:myParamObjec];
    }
    else
    {
        [item performSelector:@selector(dehydrate) withObject:myParamObjec];
    }
}

Déclarations de classe :

@interface BlankItem : NSObject {   
}

- (void)hydrate:(MyParamClass *)paramClass;
@end

@interface RegularItem : NSObject { 
}

- (void)hydrate:(MyParamClass *)paramClass;
@end

Est-ce que les deux classes, BlankItem et RegularItem, doivent hériter d'une classe de base commune pour que cela soit correct ?

Je ne vois pas ce que je fais ou ne fais pas qui produit cette erreur. Des suggestions ?

2voto

Chuck Points 138930

L'identifiant que vous souhaitez est hydrate: - vous oubliez les deux-points, ce qui en fait un identifiant complètement différent, sans deux-points. En ce qui concerne Objective-C, les identifiants "hydrater" et "hydrater:" sont aussi différents que "tuer" et "maîtriser".

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