现在接手的是一份前人的代码,其中为了在多处使用私聊,将私聊类作为父类,让所有会用到私聊的地方都直接继承了这个父类。这种方式不太好,之后看别人的代码的时候,突然想起来,还有单例这个东西可以用。但是单例是否真的适合我的场景?先来看看,objc 中的单例有哪些不同之处。
当某个类在整个程序中只需要存在一个实例的时候,就可以使用单例模式。一般管理类可以用到单例。在其他语言比如 C++/java 中,可以通过将构造函数私有化来避免对面的重复创建,但在oc中需要另外的机制来实现。
+(instancetype)shareInstance{
static dispatch_once_t once;
static id instance;
dispatch_once(&once, ^( instance = [[self alloc] init];));
return instance;
}
在实际使用之中,有一些问题需要考虑:
- "单例就是披着羊皮的全局状态":单例可以用在任何地方而不需要被显示声明依赖。
- 对象的生命周期:由于单例实例没有明确的所有者,他自己管理自己的生命周期,于是,关闭一个单例实例变得困难。
- dispatch_once 死锁:在单例的实例化之中,如果出现了循环引用,就会出现死锁。其实这个也是第一个需要注意的点的引申,因为没有显示声明依赖,就容易出现这种情况。
参考:
1 Android源码分析之单例模式
2 Objective-c单例模式的正确写法
3 避免滥用单例
4 滥用单例之dispatch_once死锁