OC écrit singleton comme ça

Le mode Singleton est un mode de conception de logiciel couramment utilisé. Dans sa structure de base, il ne contient qu'une classe spéciale appelée singleton. Le modèle de singleton peut garantir qu'il n'y a qu'une seule instance d'une classe dans le système. Autrement dit, une classe n'a qu'une seule instance d'objet. Le rôle de la plupart des modèles uniques est probablement de partager des informations et de gérer le centre. Singleton peut également être utilisé pour transmettre une valeur.

Dans le processus de développement, nous utilisons souvent des singletons du système:

  1. [UIApplication sharedApplication]: symbole d'une application, un objet UIApplication représente une application
  2. [NSNotificationCenter defaultCenter]: Notification
  3. [NSUserDefaults standardUserDefaults]: un moyen de stockage de localisation système
  4. [NSFileManager defaultManager]: Opérations sur les fichiers

1. La manière simple

La méthode singleton de scénario la plus simple en OC

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

Créez un pointeur statique; si le pointeur ne pointe pas sur un objet, créez un objet et laissez le pointeur tenir l'objet; renvoyez enfin l'objet détenu par le pointeur. Comme il est statique, l'objet détenu par le pointeur ne sera pas libéré, ce qui garantit qu'un seul objet sera renvoyé chaque fois que cette méthode est appelée. Cela atteint l'objectif de singleton, mais il n'est pas recommandé d'écrire de cette manière, dans un environnement multithread. L'écriture n'est pas garantie d'être thread-safe

2. Verrouillage d'objets

Utilisez des mots clés pour verrouiller les objets afin de garantir la sécurité des threads. Il s'agit de l'une des méthodes d'implémentation de singleton recommandées par Apple


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

Ce code ne peut être exécuté que dans une file d'attente, ce qui garantit parfaitement que le singleton n'a qu'un seul objet.

RemarqueLes verrous Mutex sont liés à la concurrence multithread. La signification fondamentale est que plusieurs threads accèdent au même morceau de code en même temps. Ils doivent être exécutés dans l'ordre et ne peuvent pas être simultanés. Cela peut résoudre efficacement le problème de sécurité du multithreading.

Je n'ai exécuté la méthode ci-dessus qu'une seule fois, mais lorsque j'utilise cette méthode pour la deuxième fois, l'instruction if doit toujours disparaître? Une fois que tout le monde a créé les objets, ils continuent à faire la queue petit à petit, ce qui affecte trop l'efficacité. Par conséquent, en tant que développeur, les choses qui consomment des ressources de thread et fonctionnent de manière inefficace ne sont pas autorisées. Voici un meilleur moyen.

3.GCD

Utilisez GCD dispatch_once pour vous assurer que le code de l'objet de scène n'est exécuté qu'une seule fois pendant tout le programme en cours d'exécution

+(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;
}

Remarque Dispatch_once est un objet dans GCD. Cette fonction peut garantir que, quel que soit le nombre d'appels, le bloc interne ne sera exécuté qu'une seule fois pour garantir l'unicité de l'exécution du code.

En résumé, la méthode singleton utilisée par OC est généralement de ces trois, et nous utilisons généralement la troisième, qui a une sécurité plus élevée et une meilleure efficacité d'exécution.

Je suppose que tu aimes

Origine blog.csdn.net/zjpjay/article/details/86487777
conseillé
Classement