検索

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

objective-c - 如何避免通过[[alloc] init]创建iOS单例类

网站普遍的创建单例类的方法有下面两种:

+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}
+ (instancetype)sharedManager {
    static id _sharedInstance = nil;
    @synchronized(self) {
        if (_sharedInstance == nil)
            _sharedInstance = [[self alloc] init];
    }
    return _sharedInstance;
}

但是该如何避免意外的用[[alloc] init]创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init或者copy的情况

大家讲道理大家讲道理2771日前736

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

  • PHP中文网

    PHP中文网2017-04-18 09:43:01

    http://www.jianshu.com/p/08b1...
    私のこのブログ投稿をご覧ください。

    返事
    0
  • 黄舟

    黄舟2017-04-18 09:43:01

    メソッドを見つけるためにもう一度 stackovweflow に行きました。これはシングルトン モードであるため、呼び出し元はシングルトンの要件に厳密に従い、統合インターフェイス (ここではsharedInstance) を通じてシングルトンを作成する必要があると思います。 no call [[class alloc] init] も正常にシングルトンを作成できます。[[class alloc] init] が発生した場合、Xcode はこのメソッドを使用できないという警告を表示する必要があると思います

    。 リーリー

    返事
    0
  • PHPz

    PHPz2017-04-18 09:43:01

    追加の作成が多数あり、これらの側面をオーバーロードしてsharedManagerインスタンスを返すか、例外を直接スローする新しいメソッドもあります。

    返事
    0
  • 迷茫

    迷茫2017-04-18 09:43:01

    allocWithZone メソッドと copyWithZone メソッドをオーバーライドします。
    alloc、copy、new のいずれを介しても、allocWithzone と copyWithzone を呼び出すことによってスペースが割り当てられるためです。
    sharedManager メソッドのコードをこれら 2 つのメソッドに記述して、シングルトンの状況を最初から実現できます

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:43:01

    • (instancetype)init {
      @throw [NSExceptionExceptionExceptionWithName:@"Disable"reason:@"代わりに init を使用してください..." userInfo:nil];
      return self;
      }

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:43:01

    このように書いてください

    リーリー

    返事
    0
  • キャンセル返事