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