第一種不能在全域使用...沒有值。第二種可以..搞不清楚原理阿
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;
}
是這樣的,第一種是現在ObjC單例的標準代碼。
這種方式的單例,是ARC(自動記憶體管理)模式下的標準形式,外部呼叫時,直接
[类名 shareUser]
获取单例,记得h文件中要写接口,不要使用_sharedSingleton
。xxx.h
這裡的
instancetype
傳回目前類別的型別。至於第二段程式碼把
static User *_sharedSingleton = nil;
写成全局变量,是MRC时代的写法,包括重写(id)allocWithZone:(NSZone *)zone
等方法,也是舊式寫法。static關鍵字修飾的靜態變數的生命週期都是一樣的,編譯時初始化,只有當程式退出後記憶體才會釋放!然而,變數是存在作用域的,就例如你的第一種寫法,這個變數是一個局部靜態變量,只能在這個方法中使用!而你的第二種寫法,這個變數是一個全域靜態變量,可以全域使用