cari

Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu740

membalas semua(6)saya akan balas

  • PHP中文网

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

    http://www.jianshu.com/p/08b1...
    Lihat catatan blog saya ini.

    balas
    0
  • 黄舟

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

    Saya pergi ke stackovweflow sekali lagi untuk mencari kaedah, saya fikir memandangkan ia adalah mod tunggal, pemanggil harus mematuhi keperluan tunggal dan mencipta satu tunggal melalui antara muka bersatu (di sini dikongsi Instance), dan harus ada. tiada panggilan [ [class alloc] init] juga boleh berjaya mencipta satu contoh Jika [[class alloc] init] berlaku, saya rasa Xcode harus memberi amaran bahawa kaedah ini tidak boleh digunakan

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

    balas
    0
  • PHPz

    PHPz2017-04-18 09:43:01

    <🎜>Terdapat banyak ciptaan tambahan, dan terdapat juga kaedah baharu Melebihkan aspek ini untuk mengembalikan tika sharedManager, atau membuang pengecualian terus <🎜>

    balas
    0
  • 迷茫

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

    <🎜>Timpa kaedah allocWithZone dan copyWithZone. <🎜> Kerana sama ada melalui alloc, copy atau baru, ruang diperuntukkan dengan memanggil allocWithzone dan copyWithzone. <🎜>Anda boleh menulis kod dalam kaedah sharedManager ke dalam dua kaedah ini dan anda boleh menyedari situasi tunggal dari bawah ke atas<🎜>

    balas
    0
  • 大家讲道理

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

    • (instancetype)init {
      @throw [NSException exceptionWithName:@"Disable" reason:@"Sila gunakan init sebaliknya..." userInfo:nil];
      kembali diri;
      }

    balas
    0
  • 天蓬老师

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

    Tulis sahaja seperti ini

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

    balas
    0
  • Batalbalas