Rumah > Soal Jawab > teks badan
网站普遍的创建单例类的方法有下面两种:
+ (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
的情况
黄舟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;
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 <🎜>
迷茫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<🎜>
大家讲道理2017-04-18 09:43:01
(instancetype)init {
@throw [NSException exceptionWithName:@"Disable" reason:@"Sila gunakan init sebaliknya..." userInfo:nil];
kembali diri;
}
天蓬老师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;
}