网站普遍的创建单例类的方法有下面两种:
+ (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
的情况
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
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;
}
Tulis sahaja seperti ini