第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿
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
は使用しないでください。[类名 shareUser]
获取单例,记得h文件中要写接口,不要使用_sharedSingleton
。xxx.h
这里的
instancetype
返回当前类的类型。至于第二段代码把
xxx.h🎜 リーリー 🎜ここでのstatic User *_sharedSingleton = nil;
写成全局变量,是MRC时代的写法,包括重写(id)allocWithZone:(NSZone *)zone
instancetype
は、現在のクラスの型を返します。 🎜 🎜2 番目のコードに関しては、static User *_sharedSingleton = nil;
をグローバル変数として記述するのが、(id)allocWithZone:(NSZone の書き換えを含む) MRC 時代の記述方法です。 *)zone
などのメソッドも古い形式の書き方です。 🎜static キーワードによって変更された静的変数のライフサイクルは同じであり、コンパイル時に初期化され、メモリはプログラムの終了時にのみ解放されます。ただし、変数にはスコープがあります。たとえば、最初の記述方法では、この変数はローカル静的変数であり、このメソッドでのみ使用できます。 2 番目の書き方に関しては、この変数はグローバル静的変数であり、グローバルに使用できます