第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿
1.+ (User *)shareUser {
static User *_sharedSingleton = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}
2.static User *_sharedSingleton = nil;
@implementation User
(User *)shareUser {
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}
(id)allocWithZone:(NSZone *)zone
{
if (_sharedSingleton == nil) {
_sharedSingleton = [super allocWithZone:zone];
}
return _sharedSingleton;
}
(id)copyWithZone:(NSZone *)zone
{
return _sharedSingleton;
}
Itu sahaja, yang pertama ialah kod standard semasa ObjC singleton.
Kaedah singleton ini ialah bentuk standard dalam mod ARC (pengurusan memori automatik) Apabila memanggil secara luaran, terus
[类名 shareUser]
dapatkan singleton Ingat untuk menulis antara muka dalam fail h dan jangan gunakan_sharedSingleton
.xxx.h
Di sini
instancetype
mengembalikan jenis kelas semasa.Bagi sekeping kod kedua, menulis
static User *_sharedSingleton = nil;
sebagai pembolehubah global adalah kaedah penulisan pada era BSMM, termasuk menulis semula(id)allocWithZone:(NSZone *)zone
dan kaedah lain, yang juga merupakan kaedah penulisan gaya lama.Kitaran hayat pembolehubah statik yang diubah suai oleh kata kunci statik adalah sama Ia dimulakan pada masa penyusunan dan memori hanya akan dikeluarkan apabila program keluar! Walau bagaimanapun, pembolehubah mempunyai skop Sebagai contoh, dalam cara pertama anda menulis, pembolehubah ini ialah pembolehubah statik tempatan dan hanya boleh digunakan dalam kaedah ini! Bagi cara penulisan kedua anda, pembolehubah ini ialah pembolehubah statik global dan boleh digunakan secara global