objective-c - 如何避免通过[[alloc] init]创建iOS单例类
大家讲道理
大家讲道理 2017-04-18 09:41:01
0
6
738

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

+ (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的情况

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(6)
Ty80

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

いいねを押す +0
黄舟

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

。 リーリー
いいねを押す +0
PHPzhong

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

いいねを押す +0
迷茫

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

いいねを押す +0
大家讲道理
  • (instancetype)init {
    @throw [NSExceptionExceptionExceptionWithName:@"Disable"reason:@"代わりに init を使用してください..." userInfo:nil];
    return self;
    }

いいねを押す +0
Peter_Zhu

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

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