Sí, NSStrings (cadenas literales) codificadas de forma rígida (es decir, cualquiera @"..."
en su código fuente) se convierten en cadenas que existen indefinidamente mientras se ejecuta el proceso.
Sin embargo , los métodos de NSArraycontainsObject:
llaman isEqual:
a sus objetos, por lo tanto, incluso una cadena creada dinámicamente como la [NSString stringWithFormat:@"%d", 2]
que devolveríaYES
en su fragmento de muestra.
Esto se debe a que el método de NSString isEqual:
(o más precisamente su isEqualToString:
) se implementa para tener en cuenta el contenido (en lugar de comparar identidades de puntero) y, por lo tanto, devuelve YES
cualquier par de cadenas que contengan la misma secuencia de caracteres (en el momento de la comparación), sin importar cómo y cuando fueron creados.
Para verificar la identidad igual (puntero), tendría que enumerar su matriz y comparar a través de
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(aunque lo más probable es que no quieras).
O de una manera más conveniente:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(lo más probable es que tampoco quieras este).
Resumiendo:
Entonces, la razón por la que está recibiendo una respuesta positiva NOcontainsObject:
es porque las cadenas literales comparten la misma instancia constante, SINO porque por convención llama , que es consciente del contenido.containsObject:
isEqual:
Es posible que desee leer la documentación (breve) isEqual:
del protocolo NSObject .