直接上代码,后面详解
- 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 | 深 | 深 | 单层深 | 单层深 |