Compruebe si la instancia de NSString está contenida en un NSArray

80

Tengo una matriz con un montón de cadenas y quiero verificar si una determinada cadena está contenida en la matriz. Si utilizo el containsObjectmensaje: en la matriz, obtengo resultados correctos. ¿Todos los NSStringobjetos con la misma cadena apuntan al mismo objeto? ¿O por qué está containsObjectfuncionando?

el reverendo
fuente

Respuestas:

171

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 YEScualquier 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

(aunque lo más probable es que no quieras).

O de una manera más conveniente:

(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 .

Regexident
fuente
17

containsObject:realiza una verificación de valor, no una verificación de puntero. Utiliza el isEqual:método definido por NSObject y anulado por otros objetos para la prueba. Por lo tanto, si dos cadenas contienen la misma secuencia de caracteres, se considerarán iguales.

La distinción entre prueba de puntero y prueba de valor es muy importante en algunos casos. El compilador combina las cadenas constantes definidas en el código fuente para que sean el mismo objeto. Sin embargo, las cadenas creadas dinámicamente no son el mismo objeto. Aquí hay un programa de ejemplo que demostrará esto:

El resultado de este programa es:

2011-04-27 17: 10: 54.686 a.out [41699: 903] constantString == constantString2
2011-04-27 17: 10: 54.705 a.out [41699: 903] constantString! = DynamicString
2011-04-27 17 : 10: 54.706 a.out [41699: 903] [constantString isEqual: dynamicString] == YES
2011-04-27 17: 10: 54.706 a.out [41699: 903] theArray contiene:
constantString: 1
constantString2: 1
dynamicString: 1

ughoavgfhw
fuente
4

Puede usar containsObjectpara averiguar si existe cierta cadena,

isuru
fuente