iOS设计模式-单例

直接上代码,后面详解

  • 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设计模式-单例)