转自于宏创学院:单例singleton模式–单例类的实现 – 宏创学院
以前写的单例类只是提供了一个 类方法让外界使用 并没有将alloc方法考虑进去,因为一般调用单例的方法 都是类方法 但是万一还是有人在多个地方获取单例对象的时候还是使用alloc怎么办呢?看了上面的教程才知道还有这种写法
其实,单例类的写法有很多种
这里先提供一般常用的三种单例类的写法:
如:我写一个UserInfo的单例类
1.使用GCD dispatch_once 整个程序运行间只执行一次
2.加线程锁 NSLock
3:使用@synchronized
但是上面的写法都是没有将外界会再次使用alloc的,而不是直接使用shareInstance类方法的情况考虑进去的,测试使用这个类方法创建 和 使用 alloc 创建的地址不是一样的,所以最好要防止这种情况出现
#import//这里遵守NSCopying 是因为将copy考虑了进去 自定义的类要使用copy必须遵守这个,开发中不考虑这个的可以不遵守的
@interface Singleton:NSObject <NSCopying>
/**
* 获取单例类
*
* @return 单例类对象
*/
+(instancetype)sharedInstance;
@en
#import "Singleton.h"
@implementationSingleton
staticid _instance;
+(instancetype)sharedInstance
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken,^{
_instance=[[selfalloc]init];
});
return_instance;
}
//实现这个方法以后 无论外界alloc多少次 不同的对象,它们的地址都是一样的
+(id)allocWithZone:(struct_NSZone*)zone
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken,^{
_instance=[superallocWithZone:zone];
});
return_instance;
}
//这个方法只有在遵守了NSCopying才会起作用 保证了 外界使用copy这个类的对象的时候,地址还是一样的
-(id)copyWithZone:(NSZone*)zone
{
return_instance;
}
@end
这样写的话无论调用alloc 还是我们提供的类方法创建出来的对象都是头一个对象
还有需要注意的是:一个父类是单例类,那么它的子类也是单例类 ,并且它的地址跟父类是一样的