Supongo que tengo un objeto llamado Person
que tiene la propiedad socialSecurityNumber
, y esta clase anula el método isEqual:
para devolver verdadero cuando las propiedades del número de la seguridad social son iguales. Y digo que he puesto un montón de instancias de Person
en un NSDictionary
.¿ObjectForKey de NSDictionary: se basa en la identidad o la igualdad?
Si ahora ejecutar un objeto newPerson
, que pasa a tener el mismo número de la seguridad social como uno que ya están en el diccionario, y lo hago [myDictionary objectForKey:newPerson]
, tendrá que utilizar el isEqual:
y volver SÍ, o va a comparar los punteros y volver NO?
sé que puedo escribir una simple prueba para averiguar, pero quiero entender cómo exactamente objectForKey:
encuentra una coincidencia en un diccionario, y en general la consistencia de esto es a través del Cacao (es decir, hace NSArray
's indexofObject:
funcionan de la misma?)
¿Cómo implementar hash? –
Como quiera, siempre que 2 objetos que sean iguales tengan el mismo hash, y que el hash no sea demasiado complejo para calcular. El algoritmo utilizado para eso depende de usted, pero dos objetos con diferentes valores hash siempre se considerarán diferentes, y dos objetos con el mismo valor hash se considerarán probablemente iguales, y llamarán 'isEqual:' para asegurarse de que son verdaderamente iguales en verdad. Esto permite una comparación muy rápida y la búsqueda del diccionario comparando solo los valores hash (que son solo enteros), y solo realiza una comparación real con 'isEqual:' cuando los hash son iguales. – AliSoftware
Por ejemplo, para una cadena, uno puede implementar el método 'hash' devolviendo la longitud de la cadena. Dos cadenas que son iguales tendrán el mismo hash, y 2 cadenas diferentes tendrán diferentes valores de hash. Algunas cadenas que son diferentes (como '@" bar "' y '@" baz "') seguirán teniendo el mismo valor hash, pero eso no es un problema, en ese caso 'isEqual:' hará un análisis más profundo personaje para verificar la igualdad. Pero esta comparación (que toma más tiempo) solo se realizará para comparar cadenas de la misma longitud: una cadena con diferente longitud devolverá 'NO 'más rápidamente. – AliSoftware