导读
iOS weak 关键字漫谈
Objective C & iOS Weak Singletons
从以上导读中我见识到了weak的新用法或者说新的应用场景:单例。
我们之前的做法都是用一个static来修饰的强指针来持有这个单例,那这样的话这个单例就会跟随程序的生命周期知道进程杀死。那有时候这个单例可能依托于某一个视图控制器或者某一个功能模块,只要这个视图控制器或者功能模块销毁了那这个单例对象也就毫无意义了,那这个时候如果采用全局单例就会有内存浪费,所以有了今天的Weak Singleton。
那么从导读上的文章我说一下步骤代码:
代码如下
1、构建单例
//采用锁的方式构建
+ (instancetype)sharedInstance
{
//static修饰的是弱引用指针
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
@synchronized(self) {
if (strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
}
}
return strongInstance;
}
//采用锁的方式构建
+ (instancetype)sharedInstance
{
//static修饰的是弱引用指针
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
});
return strongInstance;
}
2、作为某一个类的实例变量或者属性也是可以的,但是属性得是强引用
//实例变量
{
ASingletonClass *_singletonInstance;
}
//属性
@property (nonatomic, strong) ASingletonClass * singletonInstance;
3、创建这个单例对象,并赋值给实例变量
_singletonInstance = [ASingletonClass sharedInstance];
PS: 其中ASingletonClass指的是单例类
但是呢这个单例类必须得被别的类强引用要不然创建之后就会释放,其实和之前的普通的本类全局的强引用是一样的,只不过起到了在本类没释放掉之前都是同一个对象的效果。
以上!!!