Función modificadora de iOS
En...
ARC: asignar, débil, fuerte, copiar
MRC: asignar, retener, copiar, no atómico, atómico
Asignación (ARC/MRC)
1. Este modificador significa asignación directa, que se utiliza para tipos de datos enteros/de punto flotante.
2. Si no se utiliza la copia de retención débil y fuerte, se utilizará la asignación de forma predeterminada. (Existe una relación entre los dos)
3. Por supuesto, el objeto también se puede modificar con asignación, pero el contador del objeto no será +1. (La diferencia de fuerte).
4. Si se usa para modificar las propiedades de un objeto, el puntero no apuntará a cero después de que se destruya el objeto, por lo que se producirá un error de puntero salvaje (diferente de débil).
Débil (arco) (objeto)
1. Un puntero débil es un modificador de un objeto, es decir, no puede modificar int float.
2.2. El contador de referencia modificado por débil no será +1, es decir, se asignará directamente.
3. Se crean referencias débiles para romper referencias circulares. Por ejemplo, en un bloque, al copiar, la tecnología de referencia del objeto utilizado internamente será +1. Si se usa [nombre del método self], habrá un puntero fuerte que apuntará a la dirección de memoria de la clase donde se encuentra self, y el recuento de referencias de la clase es +1, lo que provocará que la dirección de memoria de la clase no pueda ser liberado, lo que resulta en una pérdida de memoria.
4. La razón más popular es que si el objeto al que apunta se destruye, apuntará a cero, por lo que no se producirán errores de puntero salvaje.
La diferencia entre débil y asignación
Asignación y débil, ambos son tipos de declaración de referencia débiles, pero son diferentes.
1. Las variables declaradas con débil se borrarán automáticamente de la pila y se asignarán a cero.
2. Es posible que las variables declaradas con asignación no se asignen automáticamente a cero en la pila, lo que provocará un error de puntero comodín.
Tomemos la declaración de delegación como ejemplo. En MRC, muchas declaraciones de delegados utilizan la asignación para evitar referencias circulares. En este momento, necesitamos escribir self.delegate = nil en el método -dealloc para evitar errores en el puntero salvaje del delegado. Por supuesto, en ARC, siempre que el delegado se declare débil, se liberará automáticamente.
Fuerte (arco) (objeto)
1. Asignación directa del objeto y contador de referencia +1.
2. Se reemplazaron los roles reservados en ARC.
Retener (MRC)
1. Libere el objeto antiguo (contador de objeto antiguo - 1), conserve el objeto nuevo (contador de objeto nuevo + 1) y luego apunte al nuevo. objeto.
2. En el método set, es así:
If (_dog!=zero)
{
[ _dog liberar];
}
_ dog =[perro retener];
Copiar (ARC/MRC)
1. esto en MRC. Libere el objeto antiguo (el contador de referencia del objeto antiguo es -1), copie el objeto nuevo (el contador de referencia del objeto nuevo es +1) y apunte al objeto nuevo. (El nuevo objeto se refiere al objeto al que finalmente se apunta, ya sea una copia profunda o una copia superficial).
1.1 en el método set es así:
If (_dog!=zero)
{
[_dog liberado];
}
_ dog = [dog copy];
2.copy realiza esta operación en ARC. Copie el nuevo objeto (el contador de referencia del nuevo objeto + 1) y luego apunte al nuevo objeto.
2.1 en el método set es así:
_ dog =[dog copy];
3 Instrucciones de uso:
3.1 Los atributos modificados son inmutables. Por ejemplo, NSMutableArray se modifica con la copia y fallará al agregar un objeto, porque el objeto de NSMutableArray se convertirá en NSArray después de la copia.
Si necesita una copia de un objeto NSMutableArray, utilice: mutablecopy.
3.2 Utilizar objetos que cumplan con el protocolo NSCopying.
No atómico
1. No se agrega ningún bloqueo de sincronización en el método establecido.
2. Buen rendimiento
3. Este hilo no es seguro
Atomic (Arc/MRC)
1. Agregue el mutex @synchronized (objeto de bloqueo) al método set generado.
@ sincronizado(self){ _ delegado = delegado;}
2.
3. Los bloqueos Mutex se implementan mediante sincronización de subprocesos para garantizar que solo un subproceso llame al método establecido al mismo tiempo.
4. De hecho, también existe un método de obtención. Si llama a set y get al mismo tiempo, seguirá habiendo problemas. Por lo tanto, ni siquiera el uso de decoración atómica es lo suficientemente seguro.
Introducción y diferencia entre no atómico y atómico
1. ¿Qué es la atomicidad?
Atomicidad: Entiendo la atomicidad como la ejecución única de atributos por parte de un hilo.
Por ejemplo, si dos subprocesos ejecutan el método set de un atributo al mismo tiempo, si no es atómico (es decir, se usa no atímico al declarar el atributo), entonces es posible que el subproceso A está reescribiendo un determinado valor de atributo. En este momento, el hilo B puede entrar repentinamente y leer los valores de atributo que no se han modificado. Cuando esto sucede, el valor de propiedad leído por el hilo puede ser incorrecto.
2. ¿Garantizar la atomicidad es realmente seguro para subprocesos? ¿Por qué utilizamos no átomos en oraciones cotidianas?
1. Garantizar que la atomicidad no sea segura para subprocesos. Si se requiere seguridad, se debe seguir un mecanismo de bloqueo de rosca profunda.
2. Usar bloqueos de sincronización en iOS es muy costoso y traerá problemas de rendimiento al programa.
3. ¿Por qué la atomicidad no garantiza la seguridad del hilo?
Por ejemplo, cuando se usa atómico, aún pueden ocurrir errores de subproceso: cuando el subproceso A realiza una operación de configuración, las operaciones de obtención o configuración de otros subprocesos esperarán la operación. Cuando finaliza la operación de configuración del subproceso A, el subproceso B realiza una operación de configuración y luego, cuando el subproceso A necesita una operación de obtención, obtiene el valor del subproceso B, lo que destruye la seguridad del subproceso. Si el subproceso C libera esta propiedad antes de la operación de obtención del subproceso A, también provocará que el programa falle. Por lo tanto, el simple hecho de usar atomic no hará que el subproceso sea seguro; aún necesitamos bloquear el subproceso para garantizar la seguridad del subproceso.
Solo lectura (solo lectura)
1. Deje que Xcode genere solo el método get.
2. Puede usarse cuando no desea reemplazar los atributos expuestos de manera casual.
Lectura y escritura (predeterminado)
1. Deje que Xcode genere métodos get/set.
2. Cuando no se utiliza solo lectura, es lectura y escritura de forma predeterminada.