Análisis (002) propiedades IOS

Hoy simplemente parecía atributos oc y modificadores, por supuesto, hay algo de fuerza simple y otras referencias, se nombra propiedad.

Lista de lo que algunos atributos simples y modificadores.

static int countNum = 1;

@protocol LJLDelegate <NSObject>
-(void)showDelegate;
@end

typedef void(^LJLBlock)(int);

@interface LJLPropertyViewController ()

@property(nonatomic, assign) int num;
@property(nonatomic, assign) double height;
@property(nonatomic, assign) int age;
@property(nonatomic, strong) NSString * str;
@property(nonatomic, copy) NSString * str2;
@property(nonatomic, weak) id <LJLDelegate>delegate;
@property(nonatomic, copy) LJLBlock block;
@property(nonatomic, strong) UIButton * button;
@property(nonatomic, assign, readwrite) BOOL circular;//允许读写

@end

Atributo creado por la manera anterior, en el que el sistema crea automáticamente un método set / get del
funcionamiento de una máquina real, el arm64. Llamar a un método objc_msgSend frente preparará los parámetros de identificación propia, SEL, valor requerido primero
   

self.num = 10;
self.height = 1.85;
self.age = 30;
self.str = @"ljl";


 Registro se utiliza para almacenar parámetros, típicamente ~ 0x0 0x7
 registro de parámetros se almacenan en este momento
 0x0: Auto ID
 0x1: setNum:
 0x2: 10
    
retienen fuerte y operación de liberación llevada a cabo de forma automática en la parte inferior. Entonces se usará una copia modificada distinguir átomos y no atómica.
 1, la propiedad no original (no atómica)

En la implementación subyacente

oldValue = *slot
*slot = newValue;


 2, atómico (atómico)

spinlock_t& slotlock = PropertyLocks[slot];
slotlock.lock();
oldValue = *slot;
*slot = newValue;        
slotlock.unlock();

Cerradura, entonces
 oldValue = ranura *
 * Ranura = nuevoValor;
 desbloqueo de
 este bloqueo sólo puede garantizar el conjunto de seguridad / obtener el
 

self.str = @ "ljl123";

Crear un objeto del tamaño de memoria necesaria para abrirse
 para crear una cantidad mínima de memoria para el objeto 16.
Referencia: https://www.bilibili.com/video/av79839999?from=search&seid=7187104079046109220
 crear una clase que hereda de NSObject, éxito, entonces es también un objeto (objeto de clase), el objeto y la estructura del derecho de memoria, este lugar cuestión. Primer registro de los detalles vienen más tarde encontró una explicación más detallada, tales como el dios que a su vez guiar el ala:

@interface LGPerson : NSObject
@property(nonatomic, assign) int num;
@property(nonatomic, assign) double height;
@property(nonatomic, assign) int age;
@end
    
LGPerson *p1 = [LGPerson alloc];
p1.age = 10;
p1.num = 5;
p1.height = 1.8;

(lldb) x/4gx p1
0x600000a899a0: 0x0000000109a79b00 0x0000000a00000005
0x600000a899b0: 0x3ffccccccccccccd 0x0000000000000000

Excepto que esta vez los primeros 8 bits ISA (primer atributo del objeto es ISA, atributos ocultos) que
int es de cuatro 8 bits doble. Esta vez la segunda int num ocho de venta, no se ajusta a los cuatro restantes doble altura, que pondrá el tercer ocho. A continuación se coloca detrás int int los segundos 8 bits. Como el código 0x0000000a00000005. 10 y 5. Este contiene el valor de nuestro conjunto. Este lugar es un sistema de optimización de la memoria, la parte posterior de la segunda posición a cuatro puntos al valor de num 5. Sin embargo, con la combinación de los siguientes decir, entonces yo no entiendo muy bien esto no parece acorde con el principio de alineación de memoria, por lo que existen dudas con respuestas listas para encontrar la respuesta, primer registro.
 

@implementation LJLPropertyViewController

struct StructTwo {
    double b;       //8字节  0-7
    int c;          //4字节  8-12  后面补齐 13-15  总大小为16
} MyStruct3;

struct StructTwo1 {
    double b;       //8字节  0-7
    int c;          //4字节  8-12  后面补齐 13-15
    double f;       //8字节  16-23
    int e;          //4字节  24-28  后面补齐 29-31  总大小为32
} MyStruct2;

NSLog(@"%lu---%lu", sizeof(MyStruct3), sizeof(MyStruct2));
16  32

Sin embargo, por el MyStruct3 estructura anterior (16) MyStruct2 (32) para verificar visto, la huella de memoria para la estructura de la fila, en este orden. Tamaño de la memoria ocupada por el atributo de la determinación de su posición basada en el hecho (por ejemplo, en MyStruct2, BC desde 0 0-7, c 8 comienza desde 8-11 f 16-23,11 y 16 parte de una posición después de la 16 ajuste anterior f tan lleno.)

 MRC manual de gestión de memoria
    delegado uso ASIGNAR
 ARC gestión de memoria automática
    delegado uso débil
 

modificadores

. 1, fuerte (retener sustancialmente el mismo efecto)
    fuerte referencia
    es el modificador modificador predeterminada
    que sostiene el objeto, el recuento de referencia de 1. objetos modificados se destruyen en la cuenta de referencia es cero.
 2, débil
    referencias débiles
    contador de referencia no aumenta (el equivalente de un nuevo puntero al objeto original, el objeto original cuando se libera se dará a conocer), la cuenta de referencia del objeto es 0, mientras que el objeto del puntero de dirección de liberación se fija nula. Generalmente se usa para romper el ciclo de referencias y delegado modificado.
 3, asigne
    débil de referencia
    tipos básicos de datos y el tipo se utiliza generalmente para modificar ID
    cuando modificado objeto. Cuando el contador de referencia del objeto es 0, el objeto se libera no establece puntero nulo, el campo de puntero se produce. Por lo general no puede modificar objetos usando y asignación.
    Debido a que los tipos de datos básicos normalmente asignados en la pila, la memoria de pila es manejado automáticamente por el sistema, no hace que el campo de puntero, es posible asignar una modificación.
 4, copie
    los fuerte referencia
    objetos copia modificados son inmutables.
    El equivalente de una copia en el momento de los métodos de establecimiento de llamada de un objeto.

@property (nonatomic, copy) NSArray *datas;
NSMutableArray *datas = [NSMutableArray arrayWithObject:@"data"];
self.datas = datas
//相当于 self.datas = [datas copy];

Así que incluso si se modifica el número de objetos en el interior los datos básicos en la parte posterior, que no afectará el número de objetos en el interior self.datas.
 
 5, atómica
    atomicidad
    propiedad predeterminada
    para garantizar la seguridad set / get, pero no puede hilo de seguridad garantía. Y el rendimiento es más lento que no atómicos casi 20 veces.
    Cuando el subyacente conjunto de sistema de ejecución / método de obtener bloqueará, asegurando de este modo que el conjunto / sacar el tiempo para estar seguro, pero no puede garantizar que todo el objeto está a salvo hilo.
    Ilustración: obtener el método de hilo A de funcionamiento medio, llamadas hilo B establecidos en este momento porque hay tan necesarios e hilo de modo bloqueado Un ejecutado, entonces el objeto es obtener un hilo intacto un GET.
    Pero si el hilo Una llamada para obtener, mientras que el hilo B, C rosca para llamar a todo listo. Es un valor que es probable que sea B, antes de que el conjunto C, se puede establecer después de que uno o más de.
 6, no atómica
    permite el acceso simultáneo de múltiples hilos, hilo de seguridad no está garantizada. De alto rendimiento, el uso general no atómica.
 
 7, escritura y lectura
    permite leer y operaciones de escritura
    de modificador por defecto, el sistema genera automáticamente un conjunto / método get.
 8, de sólo lectura
    sólo lectura
    sistema sólo generará un método get no genera un método set.

ACLStudent.h

@interface ACLStudent : NSObject

@property (nonatomic, assign, readonly) NSInteger studentId;
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
@property (nonatomic, copy, readonly) NSString *lastName;
- (instancetype)initWithStudentId:(NSInteger)studentId firstName:(NSString *)firstName lastName:(NSString *)lastName;
@end

--------------------------
ACLStudent.m
@implementation ACLStudent
- (instancetype)initWithStudentId:(NSInteger)studentId firstName:(NSString *)firstName lastName:(NSString *)lastName {
    self = [super init];
    if (self) {
        _studentId = studentId;
        _firstName = [firstName copy];
        _lastName = [lastName copy];
    }
    return self;
}

Si la llamada directa firstNamemétodo de selección student.firstName = @"Qiu", luego de error directa, lo que sugiere que no es capaz de declarar la asignación de propiedad de sólo lectura. KVC luego usarlo?

[student setValue:@"Qiu" forKey:NSStringFromSelector(@selector(firstName))];

Encontró que el éxito puede ser modificado por KVC, qué aspecto específico o en los documentos oficiales Accessor Buscar Implementación del Detalles .

 9, retienen
    otra NSObject y sus subclases liberan el antiguo valor del parámetro y, a continuación, se reservan el nuevo valor.
    Retendrá especificada en la estela de asignación de los mensajes entrantes es retener valor. objetos Objective-C sólo se pueden utilizar (a medida que aumenta i retendrán el recuento de referencia del objeto, los tipos básicos de objetos y Fundación Core no recuento de referencia)
la diferencia entre la copia y retener
    , por ejemplo, dos NSString * a * B y NSString
    copia es una copia un nuevo datos a la nueva dirección de memoria, y b punto a una dirección diferente, pero el contenido es el mismo.
    conservan nuevos objetos conservan 1, conservan el antiguo objeto no cambia. Para después de otro NSString, la misma dirección (para establecer un puntero, copia del puntero) del objeto El conservan +. 1.
    El conservan un puntero se copia, copia el contenido de la copia
de referencia cuentan
    , por ejemplo, a, b puntos a una misma memoria, que se proporciona la memoria una contador de referencia, cuando la memoria se asigna y se asigna a una cuenta de referencia de tiempo es 1, el contador de referencia cuando un 1 se asigna a b. En el que cuando una autorización, el recuento de referencia -1. Cuando el recuento de referencia es 0, x representa la memoria no está siendo referenciado por cualquier puntero, el sistema puede ser liberado directamente.
10, const
    modificador de la variable, de sólo lectura.
    Esto significa que el parámetro sólo puede leer, no pueden modificar el contenido. ¿Quién que casi modificación.
    Finalidad:
    para facilitar las preguntas de la prueba a encontrar rápidamente
    algoritmo a gran escala puede encontrar rápidamente qué error de módulo

    static NSString * const MB_NET_URL_Dev = @"http://";//开发环境地址
    对于不能修改的数据进行修饰

    NSString * a = @"1234";
    NSString * b = @"5678";
    NSString * c = @"90";

   const NSString * p1 = a;
    p1 = b;
    *p1 = c;//错误  指针指向的地方不能修改

    NSString const *  p2 = a;
    p2 = b;
    *p2 = c;//错误  指针指向的地方不能修改

    NSString * const p3 = a;
    p3 = b;//错误 指针本身不能修改
    *p3 = c;

    const NSString * const p4 = a;
    p4 = b;//错误 指针本身不能修改
    *p4 = c;//错误 指针指向的地方不能修改

11, regístrese
    para registrarse.
    Es preferentemente será modificada variable de en el registro, las diversas operaciones y el funcionamiento de tales variables, y rápidamente.
    Pero la CPU disponible para los usuarios de todo el registro de inactividad se limita, entonces, si llena o la necesidad de abrir un espacio en la memoria común.
 12, estática
    estática DA Tik S
    variables estáticas, no en la zona de apilamiento, en el área de datos.
    acción estática antes de la variable local, en función del valor final de esta variable no está vacío, que cambió la vida de esta variable, y conoce el final de todo el proceso, y el valor de esta variable sólo se define su función puede ser usada y reasignación .
 13, extern
    fuera de AI X
    función extern se puede utilizar para extender el rango de acción se puede extender a través del documento, siempre que el pase mundial se extiende o función modificada no es estática en la definición.
 

referencias fuertes referencias débiles

    fuerte influencia referencias fuertes y otros objetos
    débiles, asignar un objeto, como una referencia débil no se sostiene

    __strong NSObject *obj1=[[NSObject alloc] init];
    __strong NSObject *obj2=obj1;
    __weak NSObject *obj3=obj1;
    NSLog(@"%@,%@",obj1,obj2,obj3);
    obj1=nil;
    NSLog(@"%@,%@",obj1,obj2,obj3);
    //输出 :
    //<NSObject: 0x7fef53708b80>,<NSObject: 0x7fef53708b80><NSObject: 0x7fef53708b80
    //(null),<NSObject: 0x7fef53708b80>,(null)

fuerte objeto retainCount + 1, débil no. Por lo tanto, cuando la liberación objc1 objeto objc2 retainCount-1 = 1. Y retainCount objc3 después de la liberación objc1 a 0, y también siguió la liberación de memoria, por lo objc3 es nula.
 
 Aplicación
    Cuando dos objetos diferentes tienen una fuerte referencia causaría una referencia circular, que hará que el objeto no puede ser puesto en libertad mientras que señala el uno al otro. - referencias circulares
    por lo que necesita para deshacerse de una referencia circular, por ejemplo, cuando el agente se indica: @property (no atómica, débil) Identificación <Delegado> delegado ( usando asignar en MRC)
    usando el bloque resultarán en una referencia circular. Usted debe ser el bloque de retención auto, bloqueo y auto retención

    [self block:^{
        self.value=1;
    }];

    Esta vez tenemos que tener una referencia débil a uno mismo, y la auto sostiene el bloque, el bloque sostiene que la referencia débil, publicado después de su uso y no causará una referencia circular. Otro de elevación detrás del bloque método de referencia circular cuando bloque de detalle re-analizó.

    __weak typeof(self) weakself=self;
     [self block:^{
         weakself.value=1;
     }];

Sin embargo, el siguiente código no causará una referencia circular. Pero si el anidado más profundo, entonces habrá una referencia circular.

    [UIView animateWithDuration:0.2 animations:^{
         self.value=1;
     }];

Está causando una referencia circular sobre todo para ver si poseen uno al otro.
    NSTimer será una fuerte referencia al objeto actual, como para que la corriente viewController en un NSTimer, si las páginas de salida directos en esta ocasión porque NSTimer fuerte referencia a la corriente VC, VC actualmente no pueden ser puestos en libertad, lo que provocará una pérdida de memoria. Antes de la primera necesidad de destruir las páginas de salida NSTimer. Esta es la determinación similar en otro artículo Análisis NSTimer   en.
    [El invalida el temporizador];
    el temporizador = nil;
 

Análisis de la análisis actualizado contenido de los atributos y algunos no, así como la mencionada anteriormente específica modificado KVC más tarde. Más que un poco pronto para que el contenido de los perfiles personales y la capacidad de prueba para aprender e interactuar más, hay problemas, pero también la esperanza de que Dios le dará gran corrección.

Publicado 83 artículos originales · ganado elogios 12 · vistas 180 000 +

Supongo que te gusta

Origin blog.csdn.net/shengdaVolleyball/article/details/104698154
Recomendado
Clasificación