Rumah > Soal Jawab > teks badan
第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿
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;
}
ringa_lee2017-04-28 09:07:51
Itu sahaja, yang pertama ialah kod standard semasa ObjC singleton.
+ (User *)shareUser {
static User *_sharedSingleton = nil; //静态全局变量
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedSingleton = [[self alloc] init]; //dispatch once 保证大括号里的代码只执行一次
});
return _sharedSingleton;
}
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
@interface xxx : xxx
{
}
+ (instancetype)shareUser;
@end
Di siniinstancetype
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.
高洛峰2017-04-28 09:07:51
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