objective-c - oc单例的一些问题
给我你的怀抱
给我你的怀抱 2017-04-28 09:05:51
0
2
677

第一种不能在全局使用...没有值。第二种可以..搞不清楚原理阿

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;
    }

给我你的怀抱
给我你的怀抱

全員に返信(2)
左手右手慢动作

以上です。最初のコードは、ObjC シングルトンの現在の標準コードです。

リーリー

シングルトンのこのメソッドは、ARC (自動メモリ管理) モードの標準形式です。外部から呼び出す場合は、[クラス名 shareUser] を h ファイルに記述することを忘れないでください。 _sharedSingleton は使用しないでください。 [类名 shareUser]获取单例,记得h文件中要写接口,不要使用_sharedSingleton

xxx.h

+ (User *)shareUser {
static User *_sharedSingleton = nil; //静态全局变量
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
    _sharedSingleton = [[self alloc] init]; //dispatch once 保证大括号里的代码只执行一次
});
return _sharedSingleton;
}

这里的instancetype返回当前类的类型。

至于第二段代码把static User *_sharedSingleton = nil;写成全局变量,是MRC时代的写法,包括重写(id)allocWithZone:(NSZone *)zone

xxx.h🎜 リーリー 🎜ここでの instancetype は、現在のクラスの型を返します。 🎜 🎜2 番目のコードに関しては、static User *_sharedSingleton = nil; をグローバル変数として記述するのが、(id)allocWithZone:(NSZone の書き換えを含む) MRC 時代の記述方法です。 *)zone などのメソッドも古い形式の書き方です。 🎜
いいねを押す +0
小葫芦

static キーワードによって変更された静的変数のライフサイクルは同じであり、コンパイル時に初期化され、メモリはプログラムの終了時にのみ解放されます。ただし、変数にはスコープがあります。たとえば、最初の記述方法では、この変数はローカル静的変数であり、このメソッドでのみ使用できます。 2 番目の書き方に関しては、この変数はグローバル静的変数であり、グローバルに使用できます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート