Comprender la comparación NSString

Ambas comparaciones se evalúan como verdaderas:

1)

@"foo" == @"foo"; 

2)

 NSString *myString1 = @"foo"; NSString *myString2 = @"foo"; myString1 == myString2; 

Sin embargo, definitivamente hay momentos en los que dos NSString s no se pueden comparar utilizando el operador de igualdad, y [myString1 isEqualToString:myString2] es necesario en su lugar. ¿Alguien puede arrojar algo de luz sobre esto?

    La razón por la cual == funciona es debido a la comparación del puntero. Cuando define un NSString constante usando @"" , el comstackdor unifica la referencia. Cuando las mismas constantes se definen en otros lugares en su código, todas señalarán la misma ubicación real en la memoria.

    Al comparar instancias NSString , debe usar el método isEqualToString: :

     NSString *myString1 = @"foo"; NSString *myString2 = @"foo"; NSString *myString3 = [[NSString alloc] initWithString:@"foo"]; NSLog(@"%d", (myString2 == myString3)) //0 NSLog(@"%d", (myString1 == myString2)); //1 NSLog(@"%d", [myString1 isEqualToString:myString2]); //1 NSLog(@"%d", [myString1 isEqualToString:myString3]); //1 [myString3 release]; 

    El operador de igualdad == solo compara las direcciones del puntero. Cuando crea dos cadenas idénticas utilizando la syntax literal @"" , el comstackdor detectará que son iguales y solo almacenará los datos una vez. Por lo tanto, los dos indicadores apuntan a la misma ubicación. Sin embargo, las cadenas creadas por otros medios pueden contener datos idénticos, pero almacenarse en diferentes ubicaciones de memoria. Por lo tanto, siempre debe usar isEqual: al comparar cadenas.

    Tenga en cuenta que isEqual: and isEqualToString: siempre devuelve el mismo valor, pero isEqualToString: es más rápido.

    == compara ubicaciones en la memoria. ptr == ptr2 si ambos apuntan a la misma ubicación de memoria. Esto sucede al trabajar con constantes de cadena porque el comstackdor usa una cadena real para constantes de cadena idénticas. No funcionará si tiene variables con los mismos contenidos, porque señalarán diferentes ubicaciones de memoria; use isEqualToString en tal caso.

    En Cocoa, las cadenas se comparan utilizando el método NSQtring isEqualToString: .

    La comparación de punteros funciona en su caso porque el comstackdor es lo suficientemente gentil como para fusionar los dos literales de cadena para apuntar a un objeto. No hay garantía de que dos cadenas idénticas compartan una instancia de NSString .

    Un ejemplo que demuestra cómo la comparación de direcciones como un sustituto para la comparación de cadenas se romperá:

      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *s1 = @"foo"; NSString *s2 = @"foo"; NSString *s3 = [[[NSString alloc] initWithString:@"foo"] autorelease]; NSMutableString *s4 = [NSMutableString stringWithString:@"foobar"]; [s4 replaceOccurrencesOfString:@"bar" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, [s4 length])]; NSLog(@"s1 = %p\n", s1); NSLog(@"s2 = %p\n", s2); NSLog(@"s3 = %p\n", s3); NSLog(@"s4 = %p\n", s4); // distinct from s1 NSLog(@"%i", [s1 isEqualToString:s4]); // 1 [pool release]; 

    Mira este ejemplo:

     NSString *myString1 = @"foo"; NSMutableString *myString2 = [[NSMutableString stringWithString:@"fo"] stringByAppendingString: @"o"]; NSLog(@"isEquality: %@", ([myString1 isEqual:myString2]?@"+":@"-")); //YES NSLog(@"isEqualToStringity: %@", ([myString1 isEqualToString:myString2]?@"+":@"-")); //YES NSLog(@"==ity: %@", ((myString1 == myString2)?@"+":@"-")); // NO 

    Por lo tanto, es probable que el comstackdor use el método isEqualToString para procesar isEquals para NSString y punteros de desreferencia, aunque no fue así. Y los indicadores son diferentes, como puede ver.

      NSString *str1=[NSString stringWithFormat:@"hello1"]; NSString *str2=[NSString stringWithFormat:@"hello1"]; NSString *str3 = [[NSString alloc] initWithString:@"hello1"]; // == compares the pointer but in our example we are taking same string value to different object using @ so it will point to same address so output will be TRUE condition if (str1==str2) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // == compares the pointer but in our example we are taking same string value to different object but we have allocated different string so both object will pount to different address so output will be FALSE condition if (str1==str3) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // compare:= compares the values of objects so output will be TRUE condition if ([str1 compare:str3]== NSOrderedSame) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // isEqual compares the values of objects so output will be TRUE condition if ([str1 isEqual:str2]) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // isEqual compares the values of objects so output will be TRUE condition if ([str1 isEqual:str3]) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // isEqualToString compares the values of objects so output will be TRUE condition if ([str1 isEqualToString:str2]) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // isEqualToString compares the values of objects so output will be TRUE condition if ([str1 isEqualToString:str3]) { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); } // == compares the pointers since we have initialized the same value to first object so the pointer be be same for same value so output will be TRUE condition if (str1==@"hello1") { NSLog(@"Both String are equal"); } else{ NSLog(@"Both String not are equal"); }