OC escribe singleton así

El modo singleton es un modo de diseño de software de uso común. En su estructura central, solo contiene una clase especial llamada singleton. El patrón singleton puede garantizar que solo haya una instancia de una clase en el sistema. Es decir, una clase tiene solo una instancia de objeto. El papel de la mayoría de los modelos singleton es probablemente compartir información y administrar el centro. Singleton también se puede utilizar para pasar el valor.

En el proceso de desarrollo, a menudo usamos algunos singletons del sistema:

  1. [UIApplication sharedApplication]: un símbolo de una aplicación, un objeto UIApplication representa una aplicación
  2. [NSNotificationCenter defaultCenter]: Notificación
  3. [NSUserDefaults standardUserDefaults]: una forma de almacenamiento de localización del sistema
  4. [NSFileManager defaultManager]: operaciones de archivo

1. La forma sencilla

El método singleton de escenario más simple en OC

 static Person *p = nil ;
+(instancetype)sharePerson{
    if(p == nil){
        p = [[Person alloc]init];
    }
    return p;
}

Crea un puntero estático; si el puntero no apunta a un objeto, crea un objeto y deja que el puntero sostenga el objeto; finalmente devuelve el objeto sostenido por el puntero. Debido a que es estático, el objeto retenido por el puntero no se liberará, lo que garantiza que solo se devolverá un objeto cada vez que se llame a este método, logrando el propósito de singleton, pero no se recomienda escribir de esta manera, en un entorno multiproceso No se garantiza que la escritura sea segura para subprocesos

2. Bloqueo de objetos

Use palabras clave para bloquear objetos para garantizar la seguridad de los subprocesos. Este es uno de los métodos de implementación de singleton recomendados por Apple


+(instancetype)defaultPerson{
	static Person *p = nil;
    @synchronized (self) {
        if (p == nil) {
            p = [[Person alloc]init];
        }
    }
    return p;
}

Este código solo se puede ejecutar en una cola, lo que garantiza perfectamente que el singleton tenga un solo objeto.

NotaLos bloqueos mutex están relacionados con la concurrencia de subprocesos múltiples. El significado básico es que varios subprocesos acceden al mismo fragmento de código al mismo tiempo. Deben ejecutarse en orden y no pueden ser concurrentes. Esto puede resolver eficazmente el problema de seguridad del subproceso múltiple.

Solo ejecuté el método anterior una vez, pero cuando utilizo este método por segunda vez, ¿la instrucción if aún debe ejecutarse? Una vez que todos han creado los objetos, todavía se van formando poco a poco, lo que afecta demasiado la eficiencia. Por lo tanto, como desarrollador, no se permite que ocurran cosas que consumen recursos de subprocesos y funcionan de manera ineficiente. Aquí viene una forma mejor.

3.GCD

Utilice GCD dispatch_once para asegurarse de que el código del objeto de escena solo se ejecute una vez durante la ejecución del programa completo

+(instancetype)sharePerson{
	static Person *p = nil ;//1.声明一个空的静态的单例对象
    static dispatch_once_t onceToken; //2.声明一个静态的gcd的单次任务
    dispatch_once(&onceToken, ^{ //3.执行gcd单次任务:对对象进行初始化
        if (p == nil) {    
            p = [[Person alloc]init];
        }
    });
  return p;
}

Nota Dispatch_once es un objeto en GCD. Esta función puede garantizar que no importa cuántas veces se llame, el bloque interno solo se ejecutará una vez para garantizar la unicidad de la ejecución del código.

En resumen, el método singleton usado por OC es generalmente de estos tres, y generalmente usamos el tercero, que tiene mayor seguridad y mejor eficiencia de ejecución.

Supongo que te gusta

Origin blog.csdn.net/zjpjay/article/details/86487777
Recomendado
Clasificación