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
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容