iOS 单例实现 - OC&&Swift

iOS 项目中 不可缺少的部分: 单例

OC版本 : 当一个对象无论被分配多少次内存时,都只会是一个内存地址

@implementation UserInfoTool

static id _instance;

static dispatch_once_t onceToken;

/**
 单例的统一访问方法 (此方法暴露在 .h文件中)

 @return 当前对象
 */
+ (instancetype)shareUserInfo{
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

/**
 实现 allocWithZone 方法: 防止其他人用 alloc init 方法 ,造成 重新分配内存

 @param zone alloc init 时的内存
 @return 当前对象
 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

/**
 当其他人用 [当前实例对象  copy]; 避免重新分配内存

 @param zone copy 的内存
 @return 当前对象
 */
- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}

/**
 当其他人用 [当前实例对象  mutableCopy]; 避免重新分配内存

 @param zone mutableCopy 的内存
 @return 当前对象
 */
- (id)mutableCopyWithZone:(NSZone *)zone{
    return _instance;
}

@end

Swift版本 : 和OC一样,当一个对象无论被分配多少次内存时,都只会是一个内存地址 : Swift中有两种方法

方法一:
// 方法一 :
static let instance : UseInfoTool = UseInfoTool()

/// 单例的统一访问方法 , 相遇当提供了一个 公共方法来生成 对象
///
/// - Returns: 当前对象 
class func shareUseInfo() -> UseInfoTool{
    return instance
}

/// 将 init() 方法 变成私有方法 , 这样就保证外界 只能调取 shareUseInfo()这个方法 或者  copy || mutableCopy
private override init() {

}

/// 重写 copy
///
/// - Returns: 当前对象
override func copy() -> Any {
    return self
}

/// 重写 mutableCopy
///
/// - Returns: 当前对象
override func mutableCopy() -> Any {
    return self
}

方法二:
// 方法二 :
// 相当于提供了一个 静态的 不可变的 成员变量
static let shareUseInfo = UseInfoTool()

private override init() {

}

override func copy() -> Any {
    return self
}

override func mutableCopy() -> Any {
    return self
}


你可能感兴趣的:(iOS 单例实现 - OC&&Swift)