iOS Swift和OC创建单例

Swift

import UIKit

class SingletonClass: NSObject {

    var name:String = ""
    
    // 注:(GCD - dispatch_once 在swift3.0后已废弃) 以下三种方式代替

    // 禁止外部调用init初始化方法
    private override init() {
        super.init()
    }
    
    /*
     单例创建方法一:
        全局静态变量法
     */
    static var shareSingleton1_Var = SingletonClass()
    static let shareSingleton1_Let = SingletonClass()
    
    /*
     单例创建方法二:
        结构体创建
     */
    class func shareSingleton2() -> SingletonClass {
        
        struct onceSingleton {
            static var singleton = SingletonClass()
        }
        return onceSingleton.singleton
    }
    /*
     单例创建方法三:
        带立即执行闭包初始化器的全局变量:
     */
    static var singleton: SingletonClass? = {
        var singleton = SingletonClass()
        return singleton
    }()
    
    class func shareSingleton3() -> SingletonClass {
        // `dispatch_once()` call was converted to a static variable initializer
        return singleton!
    }
    
}

OC

/*
单例创建方法一:
*/
+ (instancetype)sharedSingleton {
    static Singleton *_sharedSingleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //因为下边已经重写了allocWithZone方法,不能再使用alloc方法,所以这里要调用父类的分配空间的方法
        _sharedSingleton = [[super allocWithZone:NULL] init];
    });
    return _sharedSingleton;
}
// 防止外部调用alloc 或者 new
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [Singleton sharedSingleton];
}
// 防止外部调用copy (如果遵守NSCopying)
- (id)copyWithZone:(nullable NSZone *)zone {
    return [Singleton sharedSingleton];
}
// 防止外部调用mutableCopy (如果遵守NSMutableCopying)
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
    return [Singleton sharedSingleton];
}

/*
单例创建方法二:
*/
在.h文件中禁止相关创建方法的调用 (利用NS_UNAVAILABLE)
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
- (id)copy NS_UNAVAILABLE; // 没有遵循协议可以不写
- (id)mutableCopy NS_UNAVAILABLE; // 没有遵循协议可以不写
.m中实现
+ (instancetype)sharedSingleton {
    static Singleton *_sharedSingleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
          // 要使用self来调用
        _sharedSingleton = [[self alloc] init];
    });
    return _sharedSingleton;
}

你可能感兴趣的:(iOS Swift和OC创建单例)