2011-09-27 2 views
1

J'ai une question sur les variables d'un objet, je voudrais savoir si je peux vérifier si une chaîne est la variable d'instance d'un objet ou pas? Ci-dessous, un exemple pour illustrer mon problème:Comment vérifier si une chaîne est la variable d'instance d'un objet ou non?

j'ai un objet - MyObject.h:

@interface MyObject : NSObject 
{ 
    //Variables 
    id myVariable1; 
    id myVariable2; 

} 
@property (nonatomic, retain) id myVariable1; 
@property (nonatomic, retain) id myVariable2; 

Et j'ai aussi une liste de tableau:

NSArray * myArray = [[NSArray alloc] initWithObjects:@"myVariable1",@"myVariable2",@"myVariable3",@"myVariable4",nil]; 

Je voudrais savoir s'il est possible de déterminer quelles chaînes de la liste de tableaux ne sont pas définies comme variables dans l'objet MyObject.
=> myVariable3 et myVariable4 pour ce cas.

J'ai essayé d'utiliser « isKindOfClass », « isMemberOfClass », « valueForKeyPath », « valueForKey » mais sans succès ... Laissez-moi savoir si vous avez des conseils pour résoudre mon problème :)

+0

Cela n'a rien à voir avec l'exemple! Ma première édition était fausse et j'ai utilisé "méthode" cela demande si "Comment vérifier si un objet a une * propriété * *" - * pas "instance" * car c'est juste le nom de la propriété donnée (ou méthode , oups, sur moi pour ça, les doigts trop vite). Veuillez mettre à jour en conséquence. –

+0

Vous voulez probablement dire "instance variable" et non "nom d'instance" ?! – AliSoftware

+0

Vous pourriez vouloir éditer votre publication originale pour mieux refléter ce que vous voulez vraiment dire. – jlehr

Répondre

2

En supposant que les propriétés n'utilisent pas un nom setter personnalisé, vous pouvez faire:

MyObject *object = ...; 
for (NSString *name in myArray) { 
    SEL getterName = NSSelectorFromString(name); 
    if ([object respondsToSelector:getterName]) { 
    NSLog(@"MyObject has a method named %@", getterName); 
    } else { 
    NSLog(@"MyObject does not have a method named %@", getterName); 
    } 
} 
+0

C'est une bonne solution. Bien que cela ne fonctionne qu'avec des ivars exposés. – Eimantas

+0

@Eimantas que voulez-vous dire? c'est vérifier la présence d'une méthode, pas pour un ivar, et cela fonctionnera indépendamment du fait que la méthode soit déclarée dans une catégorie privée ou non. Rien n'est à l'abri de l'exécution ...;) –

+2

l'OP pose des questions sur les variables d'instance. Si je déclare une variable d'instance, mais que je ne l'expose pas via une instruction '@ property' ou un getter personnalisé, je ne pourrai pas le" détecter "en dehors de l'objet avec cette approche. – Eimantas

1

Je créerais un objet à utiliser pour la comparaison à l'aide de la classe NSClassFromString.

if ([myClass isKindOfClass:NSClassFromString(myClassString)] { 
    // class matches string 
} else { 
    // class doesn't match 
} 
0

Il est plus facile de vérifier si les valeurs du tableau sont des propriétés d'un objet. Comme dans votre cas, le valueForKey: aurait dû fonctionner seulement si myInstance1 et myInstance2 sont des objets non-nuls. Vous auriez juste besoin de mettre en œuvre la méthode - (id)valueForUndefinedKey: pour retourner nil et tout irait bien et dandy.

Vous pouvez également essayer d'utiliser la méthode object_getInstanceVariable lors de l'itération d'un tableau et de l'extraction séparée de chaque variable d'instance possible. Je crois que les instances non déclarées devraient renvoyer le pointeur NULL (par opposition aux nil instances qui sont déclarées mais indéfinies).

Questions connexes