Objective-C – NSObject estEqual, vs == comparaison?

Dupliquer possible:
Comparer des objects dans Obj-c

Quelle est la différence entre ces deux methods de vérification de l'égalité des objects:

UIButton *btn1 = [[UIButton alloc] init]; UIButton *btn2 = [[UIButton alloc] init]; 

Quelle est la différence entre:

 if (btn1 == btn2) { // Run some code } 

et

 if ([btn1 isEqual:btn2]) { // Run some code } 

La première manière compare les pointeurs, tandis que la seconde compare les objects.

Autrement dit, la première façon compare si les pointeurs ont la même valeur. Dans ce cas, il est probable que non, dans le second cas, les objects seront comparés. Comme ils sont initialisés de la même manière, ils peuvent être égaux. (Notez, il semble qu'avec l'implémentation de isEqual: de isEqual: le résultat est toujours faux.)

Dans la plupart des cas, l'utilisation de == n'est pas ce que vous voulez. Cependant, ce qui est approprié dépend de votre objective.

La réponse de Prateek et la réponse éditée de Thomas est correcte. Mais je veux juste append un piège / une confusion commune en traitant de ce type de cas ..

Considérez ce cas

  NSSsortingng *str1 = [[NSSsortingng alloc] initWithSsortingng:@"hello"]; NSSsortingng *str2 = [[NSSsortingng alloc] initWithSsortingng:@"hello"]; 

Idéalement, str1 et str2 devraient être deux objects string différents, str1 et str2 devraient pointer vers des adresses différentes. Mais s'exécuter sous le code imprime str1 == str2

 if(str1 == str2){ NSLog(@"str1 == str2"); } 

et ci-dessous code printings str1 isEqual str2

 if([str1 isEqual:str2]){ NSLog(@"str1 isEqual str2"); } 

La raison en est que les deux littéraux de string identiques passés par initWithSsortingng auront la même adresse pour commencer , donc ils sont aussi le même object (voir ceci ). C'est l'optimization des données constantes, qui est une fonctionnalité dans iOS (et de nombreuses autres implémentations que je sens).

Mais cela ne fonctionnera pas pour d'autres types d'objects / classs. Lorsque vous créez 2 UIButton ils auront des objects entièrement différents et btn1 et btn2 (voir la question) btn2 vers une adresse différente.

Différence mentionnée dans les commentaires

 if (btn1 == btn2) //This compared your pointers { // Run some code } 

et

 if ([btn1 isEqual:btn2]) //Compares UIButton object { // Run some code }