今天才知道单例模式分为严格单例模式和不严格单例模式。
单例模式要求一个类有一个实例,有公开接口可以访问这个实例。
严格单例模式,要求一个类只有一个实例;不严格单例模式,可以创建多个实例。
严格单例模式:重载 copy()、mutableCopy() 方法,返回 self,防止在外部复制实例
不严格单例模式: 继承自 NSObject,重载 copy()、mutableCopy() 方法,创建新实例,传递数据给新实例,返回新实例。其他与严格单例模式相同。
1.不重载 copy()、mutableCopy() 方法:
- (void)viewDidLoad { [super viewDidLoad]; // 不写allocWithZone <Singleton: 0x60000001b020>-<Singleton: 0x60000001b090>-<Singleton: 0x60000001b020> Singleton *instance = [Singleton shared]; Singleton *instance1 = [[Singleton alloc]init]; Singleton *instance2 = [Singleton shared]; NSLog(@"%@-%@-%@",instance, instance1, instance2); }
2.重载 copy()、mutableCopy() 方法:
// // Singleton.m // 单例模式 // // Created by 思 彭 on 2017/4/28. // Copyright © 2017年 思 彭. All rights reserved. // #import "Singleton.h" static id shared; @implementation Singleton // 仅实现此方法则是不严格单例 + (nonnull instancetype)shared { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared = [[self alloc]init]; }); return shared; } // 实现以下方法即是:严格单例 /** 重载 allocWithZone: 和 init 方法,由 dispath_once 保证父类方法只执行一次并给 shared 赋值,返回 shared。外部调用初始化方法总是获得 shared 持有的唯一实例。 @param zone <#zone description#> @return <#return value description#> */ + (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared = [super allocWithZone:zone]; }); return shared; } - (instancetype)init { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared = [super init]; }); return shared; } /** 重载 copyWithZone: 和 mutableCopyWithZone: 方法,返回 self,防止在外部复制实例。由于只有一个实例 shared,只能由 shared 调用 copy、mutableCopy 方法,那么 self 就是 shared。 @param zone <#zone description#> @return <#return value description#> */ - (id)copyWithZone:(NSZone *)zone { // return self; return [[self.class allocWithZone:zone]init]; } - (id)mutableCopyWithZone:(NSZone *)zone { // return self; return [[self.class allocWithZone:zone]init]; } // Optional - (void)reset { // Reset all properties to default value } @end
返回结果:
<Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>
好像没发现啥区别??
不重载方法:alloc和单例创建的是不一样的对象;
重载了方法: alloc和单例创建的是一样的对象;
可以参考这个博客,挺详细: http://www.cnblogs.com/silence-cnblogs/p/6776217.html
你简单的理解,欢迎给我留言!!谢谢哟!