recherche

Maison  >  Questions et réponses  >  le corps du texte

objective-c - 如何避免通过[[alloc] init]创建iOS单例类

网站普遍的创建单例类的方法有下面两种:

+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}
+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    @synchronized(self) {
        if (_sharedInstance == nil)
            _sharedInstance = [[self alloc] init];
    }
    return _sharedInstance;
}

但是该如何避免意外的用[[alloc] init]创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init或者copy的情况

大家讲道理大家讲道理2771 Il y a quelques jours734

répondre à tous(6)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 09:43:01

    http://www.jianshu.com/p/08b1...
    Consultez mon article de blog.

    répondre
    0
  • 黄舟

    黄舟2017-04-18 09:43:01

    Je suis retourné sur stackovweflow pour trouver une méthode. Je pense que comme il s'agit d'un mode singleton, l'appelant doit suivre strictement les exigences du singleton et créer un singleton via une interface unifiée (ici sharedInstance), et il devrait y avoir aucun appel [ [class alloc] init] ne peut également créer avec succès une seule instance Si [[class alloc] init] se produit, je pense que Xcode devrait avertir que cette méthode ne peut pas être utilisée

    - (instancetype)init NS_UNAVAILABLE;
    + (instancetype)new NS_UNAVAILABLE;

    répondre
    0
  • PHPz

    PHPz2017-04-18 09:43:01

    <🎜>Il existe de nombreuses créations supplémentaires, et il existe également une nouvelle méthode surcharger ces aspects pour renvoyer une instance sharedManager, ou lancer une exception directement <🎜>.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 09:43:01

    <🎜>Remplacez les méthodes allocWithZone et copyWithZone. <🎜> Parce que que ce soit via alloc, copy ou new, l'espace est alloué en appelant allocWithzone et copyWithzone. <🎜>Vous pouvez écrire le code de la méthode sharedManager dans ces deux méthodes, et vous pouvez réaliser la situation singleton à partir de zéro<🎜>

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:43:01

    • (instancetype)init {
      @throw [NSException exceptionWithName:@"Disable" Reason:@"Veuillez utiliser init à la place..." userInfo:nil];
      return self;
      }

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:43:01

    Écrivez-le comme ça

    static Singleton *slt = nil;
    
    + (instancetype)sharedInstance{
       static dispatch_once_t onceToken;
       dispatch_once(&onceToken, ^{
           slt = [[self alloc]init];
       });
       return slt;
    }
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
       static dispatch_once_t onceToken;
       dispatch_once(&onceToken, ^{
           slt = [super allocWithZone:zone];
          
       });
       return slt;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
       return slt;
    }

    répondre
    0
  • Annulerrépondre