单例模式的实现
1.单例模式的作用
- 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问.
- 从而方便的控制了实例个数,并节约系统资源
2.单例模式的使用场合
- 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)
3.单例模式的实现
- 实现单例模式,共有两种方法.一种较为复杂.一种比较简易
第一种: 复杂实现方法
- 优点 : 外界调用这个工具类时,可以通过类方法来获取单例,也可以通过alloc的方法来获取单例
// 1.提供静态变量
static MTYTool * _instance;
// 2.重写该方法,保证只分配一次内存空间
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
// 3.提供类方法
+ (instancetype)shareTool {
return [[self alloc] init];
}
// 4.更加严谨的做法
- (id)copyWithZone:(NSZone *)zone {
return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone {
return _instance;
}
外界调用测试
- (void)viewDidLoad {
[super viewDidLoad];
MTYTool *t1 = [[MTYTool alloc] init];
MTYTool *t2 = [MTYTool new];
// 打印结果: t1--<MTYTool: 0x600000011d10>, t2--<MTYTool: 0x600000011d10
// NSLog(@"t1--%@, t2--%@",t1,t2);
// 打印结果: t1--<MTYTool: 0x608000000e30>, t2--<MTYTool: 0x608000000e30>, ---<MTYTool: 0x608000000e30>,---<MTYTool: 0x608000000e30>
// NSLog(@"t1--%@, t2--%@, ---%@,---%@", t1, t2, [MTYTool shareTool], [MTYTool shareTool]);
// 打印结果: t1--<MTYTool: 0x6000000137c0>, t2---<MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>
// NSLog(@"t1--%@, t2---%@, %@, %@",t1, t2, [t1 copy], [t1 mutableCopy]);
第二种: 简易实现方法
- 弊端 : 外界调用这个工具类时,只能通过类方法来获取单例,不能通过alloc的方法来获取单例了
+ (instancetype)shareDownloadTool {
static MTYEasyTool *_instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
外界调用测试
- (void)viewDidLoad {
[super viewDidLoad];
MTYEasyTool *easy1 = [MTYEasyTool shareDownloadTool];
MTYEasyTool *easy2 = [MTYEasyTool shareDownloadTool];
// 打印结果:1--<MTYEasyTool: 0x600000004cd0>, 2--<MTYEasyTool: 0x600000004cd0>
NSLog(@"1--%@, 2--%@", easy1, easy2);
MTYEasyTool *easy3 = [[MTYEasyTool alloc] init];
MTYEasyTool *easy4 = [[MTYEasyTool alloc] init];
// 打印结果:3--<MTYEasyTool: 0x60800001ce90>, 4--<MTYEasyTool: 0x60800001cea0>
NSLog(@"3--%@, 4--%@",easy3, easy4);
}