Contenedor de iOS

En esta ocasión hablaremos sobre contenedores de datos en el desarrollo de iOS, principalmente desde la perspectiva de la gestión de pruebas internas. La gestión de pruebas internas se puede dividir en dos categorías en términos de diferencias.

Los contenedores fuertemente tipados incluyen principalmente

NSArray, NSMutableArray, NSSet, NSMutableSet, NSDictionary y NSMutableDictionary.

Los principales tipos de contenedores son

NSMapTable, NSHashTable, NSPointerArray.

Un contenedor fuertemente tipado aumentará el recuento de referencias del objeto que contiene en 1, mientras que un contenedor débilmente tipado no aumentará el recuento de referencias de los objetos en el contenedor.

Todo el mundo debería estar familiarizado con los contenedores de tipos de referencia fuertes. Esta vez hablaremos principalmente de matrices de referencia débiles en iOS.

NSMapTable es una clase de modelado de colección de variables después de NSDictionary. Su característica principal es que al almacenar datos, el objeto se puede configurar como una referencia débil y la clave no necesita seguir el protocolo NSCopying; de clave y valor Los métodos de gestión se pueden separar, tales como: clave es una referencia fuerte, valor es una referencia débil

Tienen las siguientes diferencias:

Puedes configurar el; Instancia de NSMapTable para operar en cualquier puntero, y no solo en objetos, se recomienda utilizar la API de C: puntero void * para operar. Las API basadas en objetos (como setObject:forKey:) no podrán funcionar con punteros sin objeto sin conversión de tipos.

Al configurar la tabla de mapeo, tenga en cuenta que solo las opciones enumeradas en NSMapTableOptions garantizan que el resto de la API pueda funcionar correctamente, incluida la replicación, el archivado y la enumeración rápida. Si bien se utilizan otras opciones de NSPointerFunctions en determinadas configuraciones, como conservar punteros arbitrarios, no todas las combinaciones de opciones son válidas. Es posible que la tabla de mapeo no funcione correctamente cuando se utilizan ciertas combinaciones y que ni siquiera se inicialice correctamente.

Método de creación

Inicializa el objeto NSMapTable especificando las opciones;

keyOptions: un campo de bits utilizado para especificar las opciones clave en NSMapTable.

valueOptions: un campo de bits utilizado para especificar las opciones para los valores en NSMapTable.

inicialCapacity: la capacidad inicial de NSMapTable. Esto es sólo una pista; posteriormente puede ampliar y reducir NSMapTable según sea necesario.

Constantes utilizadas para especificar el comportamiento de elementos (claves y valores) en objetos NSMapTable.

NSHashTable es similar a NSSet, excepto que admite referencias débiles. Las diferencias son las siguientes:

Puede configurar la instancia de NSHashTable para que funcione con cualquier puntero, no solo con objetos. Se recomienda utilizar la API de C: puntero void * para operar. Las API basadas en objetos (como addObject:) no podrán funcionar con punteros sin objeto sin conversión de tipos.

Debido a algunas de sus opciones, NSHashTable no es una colección, ya que puede comportarse de manera diferente (por ejemplo, si se especifican dos isEqual: cadenas iguales, se pueden agregar ambas).

Al configurar NSHashTable, tenga en cuenta que solo las opciones enumeradas en NSHashTableOptions pueden garantizar que el resto de la API funcione correctamente, incluida la replicación, el archivado y la enumeración rápida.

Si bien se utilizan otras opciones de NSPointerFunctions en determinadas configuraciones, como conservar punteros arbitrarios, no todas las combinaciones de opciones son válidas. Con ciertas combinaciones, es posible que NSHashTable no funcione correctamente e incluso que ni siquiera se inicialice correctamente.

Inicialice NSHashTable según los atributos utilizados;

opciones: opciones admitidas por elementos en NSHashTable;

capacidad inicial: el número inicial de elementos que NSHashTable puede acomodar.

NSPointerArray está modelado en NSArray y agrega estrategias de administración de memoria. No se puede almacenar nada.

Primero comprendamos NSPointerFunctionsOptions y NSPointerFunctions

NSPointerFunctions se utilizan para personalizar algunas acciones, entradas, etc., tamaño, etc. del objeto contenedor.

NSPointerFunctionsOptions

NSPointerFunctionsOptions, es una opción, dividida principalmente en tres categorías:

Gestión de memoria

NSPointerFunctionsStrongMemory: valor predeterminado, miembro de referencia fuerte

NSPointerFunctionsZeroingWeakMemory: punteros de referencia débiles en GC en desuso para evitar punteros colgantes

NSPointerFunctionsMallocMemory y NSPointerFunctionsMachVirtualMemory: administración de memoria virtual para Mach

NSPointerFunctionsWeakMemory: miembros de referencia débiles

Características, utilizadas para indicar el método de igualdad de objetos

NSPointerFunctionsObjectPersonality: hash, isEqual, descripción del objeto

NSPointerFunctionsOpaquePersonality: hash de puntero, igualdad directa

NSPointerFunctionsObjectPointerPersonality: hash de puntero, igualdad directa, descripción del objeto

NSPointerFunctionsCStringPersonality: hash de cadena, función strcmp, descripción del método de codificación UTF-8

NSPointerFunctionsStructPersonality: hash de memoria, función memcmp

NSPointerFunctionsIntegerPersonality: hash de valor

Identificador de memoria

NSPointerFunctionsCopyIn: Procesado específicamente en función del segundo tipo de selección. Si es NSPointerFunctionsObjectPersonality, se copia según NSCopying.

Por lo tanto, al usarlo, son posibles múltiples combinaciones, por ejemplo: se requieren miembros de referencia fuertes, se usa comparación de objetos y los objetos se copian al agregar