objective objective-c cocoa nsmutabledictionary

objective c - objective - Diferencias NSMapTable y NSMutableDictionary



nsdictionary to object swift (4)

La principal diferencia entre NSMapTable y NSMutableDictionary es que NSMapTable almacena punteros débiles. Esto significa que cuando llamas a smth así:

[my_table setValue: val forKey: key];

el valor y la clave no se conservan (significa que no se les envía ningún mensaje de retención). Es por eso que puede usar cualquier objeto (o tal vez no objeto, sino cualquier puntero) porque no tienen que responder para retener el mensaje.

Por lo tanto, probablemente desee utilizar NSMapTable si está utilizando la recolección de elementos no utilizados, donde no necesita preocuparse por retener el conteo de un objeto.

¿Es un NSMapTable el mismo que un NSMutableDictionary excepto para permitir que las claves sean punteros?

¿Difiere en la gestión de la memoria?


Más o menos, tiene algunas opciones adicionales que son principalmente relevantes si usas Garbage Collection (que es una especie de obsoleto, supongo). Si no usa Garbage Collection, los requisitos de administración de memoria son los mismos.

Otra diferencia es que NSMapTable puede usar opcionalmente la igualdad del puntero para hash.


NSMapTable es más flexible que NSDictionary. Mientras NSDictionary mantiene referencias sólidas para los valores y copia las claves, puede configurar NSMapTable para que tenga cualquiera de esos comportamientos independientemente para objetos y valores: fuerte, débil o copia (existen más opciones de comportamiento).

Un caso de uso práctico: un NSDictionary conserva una referencia fuerte (conserva) del puntero del valor, pero copia la clave. Esto significa que a) la instancia clave debe implementar el protocolo NSCopying yb) según la complejidad de la clase, la copia puede agregar una sobrecarga. Por otro lado, puede configurar un NSMapTable para que actúe como un NSDictionary que utiliza referencias sólidas tanto para los valores como para las claves, sin necesidad de copiar o protocolo NSCopying.

Un comportamiento de objeto a objeto podría ser emulado previamente usando un NSDictionary si todas las claves fueran NSNumbers que contengan la dirección de memoria del objeto fuente en el mapeo (no se ría, lo he visto hecho) pero fuera de este run- alrededor, NSMapTable ofrece una verdadera asignación de objeto a objeto por primera vez en una clase de colección Cocoa.

(De un gran artículo que cubre NSMapTable cuando fue presentado .)

Miremos la API. Esto devolverá un objeto que funciona de manera muy similar a un NSMutableDictionary:

[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableStrongMemory]

Esto devolverá un objeto que funciona no copia las claves:

[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory]

Nota: Parece que la API de NSMapTable ha cambiado en SDK recientes, pero esta sintaxis parece ser compatible con todos los SDK.

NSMapTable está disponible en OS X 10.5+ e iOS 6.0+.


Tenga en cuenta que NSMapTable a veces no desasigna claves y objetos si se utilizan enlaces débil-débil, débil-fuerte o débil-fuerte http://cocoamine.net/blog/2013/12/13/nsmaptable-and-zeroing-weak-references / .

También en NSMapTable.h puede encontrar que ''las entradas no se eliminan necesariamente de inmediato cuando se recupera la clave débil'' :

+ (id)weakToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0); // entries are not necessarily purged right away when the weak key is reclaimed + (id)weakToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0); // entries are not necessarily purged right away when the weak key or object is reclaimed