美文网首页
iOS设计模式-单例

iOS设计模式-单例

作者: 小_黑_屋 | 来源:发表于2018-01-02 15:36 被阅读0次

    直接上代码,后面详解

    • OC实现
    #import "OCSingleTool.h"
    
    @implementation OCSingleTool
    
    static OCSingleTool * tool = nil;
    
    + (instancetype)shareTool {
        return [[self alloc]init];
    }
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        if (tool == nil) {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                tool = [super allocWithZone:zone];
            });
        }
        return tool;
    }
    
    
    - (id)copy {
        return tool;
    }
    
    - (id)mutableCopy {
        return tool;
    }
    @end
    
    • swift实现
    import UIKit
    
    class SwiftSingleTool: NSObject {
        static let shareTool = SwiftSingleTool()
        private override init() {}
        override func copy() -> Any {
            return SwiftSingleTool.shareTool
        }
        override func mutableCopy() -> Any {
            return SwiftSingleTool.shareTool
        }
    }
    

    详解
    • 注:如果不实现copy,mutableCopy方法,在掉用的时候回报错,说你未实现copyWithZone,mutableCopyWithZone方法
      • 那为啥我们不按报错提示的去实现copyWithZone和mutableCopyWithZone的方法?因为那样还要去遵守协议,比较麻烦。
    • OC
      • OC这里基本没啥解释的,注意线程安全就可以了。
    • swift
      • swift中let关键字其本身就是线程安全的,所以不需要once函数

    这里用到了copy,就顺便总结一下
    • 非集合对象
      • copy的对象如果是不可变对象,则是浅拷贝。因为我们无法对其值进行改变。copy的对象如果是可变对象,则是深拷贝。因为其类型改变了。
      • mutableCopy都试深拷贝。因为我们需要一个新的可变的对象,以避免值改变的时候影响之前的值。
    • 集合对象
      • copy对象是不可变对象,则是浅拷贝,其它情况都是单层深拷贝(即:容器是新地址,内容是相同的地址)。原因于上面基本相同。
    \ 非集合类型(可变) 非集合类型(不可变) 集合类型(可变) 集合类型(不可变)
    copy 单层深
    mutableCopy 单层深 单层深

    相关文章

      网友评论

          本文标题:iOS设计模式-单例

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