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

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

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

大家讲道理
大家讲道理

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

membalas semua(6)
Ty80

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

黄舟

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

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

迷茫

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

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

Peter_Zhu

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;
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan