検索

ホームページ  >  に質問  >  本文

objective-c - oc单例的一些问题

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

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

给我你的怀抱给我你的怀抱2848日前705

全員に返信(2)返信します

  • ringa_lee

    ringa_lee2017-04-28 09:07:51

    以上です。最初のコードは、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
  • 高洛峰

    高洛峰2017-04-28 09:07:51

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

    返事
    0
  • キャンセル返事