美文网首页
iOS 单例实现 - OC&&Swift

iOS 单例实现 - OC&&Swift

作者: LuKane | 来源:发表于2018-04-16 00:42 被阅读25次

    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

          本文链接:https://www.haomeiwen.com/subject/cfxskftx.html