objective-c - 如何避免通过[[alloc] init]创建iOS单例类
大家讲道理
大家讲道理 2017-04-18 09:41:01
0
6
717

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

+ (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的情况

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(6)
Ty80

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

黄舟

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;
PHPzhong

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 .

迷茫

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

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

Peter_Zhu

É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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!