单例的实现
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id _instance;
dispatch_once(&once, ^{
_instance = [[self alloc] init];
});
return _instance;
}
单例的使用
单例最适合的使用场景:
- 作用域是app的整个生命周期
- app生命周期中只有一份
- 在多个类或实例中均需要方便的访问
坏味道
- 作用域小,造成最后需要销毁单例。这种应该找对作用域,在作用域相关的对象类中声明一个实例变量。
- 单例中没有实例变量,各个实例方法没有用到实例变量。这种明显应该使用类方法。
依赖注入
依赖注入是一个很好的替代方案,可以解决生命周期和多线程造成的问题。
有一篇文章讲的比较详细了,这里不多做赘述,贴链接:
https://objccn.io/issue-13-2/
其他
在这里说下静态方法(类方法)。如果一个方法没有用到实例变量,也没有修改实例的状态,这个方法不应该是实例方法,应该是类方法。比较明显的就是工具类中的工具方法。