La documentación para -hash
dice que no debe cambiar mientras se almacena un objeto mutable en una colección, y de manera similar la documentación para -isEqual:
dice que el valor -hash
debe ser el mismo para objetos iguales.Técnicas para implementar -hash en objetos de cacao mutables
Teniendo en cuenta esto, ¿alguien tiene alguna sugerencia para la mejor forma de implementar -hash
de modo que cumpla estas dos condiciones y se calcule de forma inteligente (es decir, no devuelva 0
)? ¿Alguien sabe cómo hacen las versiones mutables de las clases proporcionadas por el framework?
Lo más simple es olvidar la primera condición (no cambiar) y simplemente asegurarme de que nunca accidentalmente mute un objeto mientras está en una colección, pero me pregunto si hay alguna solución que sea más flexible.
EDIT: Me pregunto aquí si es posible mantener los 2 contratos (donde los objetos iguales tienen los mismos valores hash, y los hashes no cambian mientras el objeto está en una colección) cuando estoy mutando el interior estado del objeto. Mi inclinación es decir "no", a menos que haga algo estúpido como siempre devolver 0 para el hash, pero es por eso que estoy haciendo esta pregunta.
adivina que esta es una vieja pregunta, acabo de encontrarla ... pero no son objetos mutables usados como claves en una colección generalmente copiada? ¿Eso no solo deja de lado el problema? – nielsbot
@nielsbot: solo se copian las claves para NSDictionaries. NSSet no copia sus objetos, y la API 'CFDictionarySetValue()' tampoco copia sus claves. –
'CFDictionarySetValue' si pasa' kCFTypeDictionaryKeyCallbacks' a 'CFDictionaryCreate', ¿no? Los documentos son casi no sensuales ... Supongo que un obj de colección mutable podría, uh, almacenar en caché los valores de hash, que es lo mismo que asumir que un obj mutable en una colección no cambiará su hash, ¿verdad? – nielsbot