大概12年还在学习iOS,之后转战cocos unity,但到ios端始终会见到OC。单例模式一直用的非常古老的懒加载,最近重新复习了一下OC记录一下。
首先了解一下instancetype 与id的相同与区别。
相同点:都是万能指针,指向对象
不同点:
1.id在编译的时候不能判断对象的真实类型,instancetype在编译的时候可以判断对象的真实类型
2.id可以用来定义变量,可以作为返回值类型,可以作为形参类型;instancetype只能作为返回值类型
1.懒加载(现在已经不推荐这种方法了,线程不安全)
#import "SingletonVC.h"
static SingletonVC * _singletonVC;
@implementation SingletonVC
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if(_singletonVC == nil) {
_singletonVC = [superallocWithZone:zone];
}
return_singletonVC;
}
+ (instancetype)share{
return[[self alloc] init];}
@end
2.GCD的一次函数
#import "single.h"
staticsingle*_singleVC;
@implementation single
+(instancetype)allocWithZone:(struct_NSZone*)zong
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
if(_singleVC==nil)
{
_singleVC= [superallocWithZone:zong];
}
});
return _singleVC;
}
+(instancetype)share
{
return[[selfalloc]init];
}
@end
3.线程锁
#import "SingletonVC.h"
static SingletonVC * _singletonVC;
@implementation SingletonVC
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
@synchronized (self) {
if(_singletonVC == nil) {
_singletonVC = [superallocWithZone:zone];
}
}
return_singletonVC;
}
+ (instancetype)share{
return[[self alloc] init];
}
@end