来聊聊关于设计模式,首先来说说单例,这个是我们面向对象最最最常见的一种设计模式吧,一般适用于app中独一无二的对象,比如说音乐播放器,这个对象在整个app是不变的,是不能将其释放而重建的。进入播放页面,播放音乐,退出页面再次进来时,这个播放器的状态不能是初始化状态了,这是我们就应该用到单例设计模式,永远保证程序中只有一份而且不能被释放。AFN自从由NSURLRequest用了NSURLSession之后也是有内存泄漏的,用了单例就不会出现了,单例设计模式就是充分利用了static这个关键字+GCD。
修饰局部:1:当static关键字修饰局部变量时,该局部变量只会初始化一次,在系统中只有一份内存 2:static关键字不可以改变局部变量的作用域,但是可延长局部变量的生命周期,该变量直到整个项目结束的时候才会被销毁
修饰全局:1:作用域仅限于当前文件,外部类不可以访问到该变量
1>方式一:static修饰的局部
+ (AFHTTPSessionManager *)sharedHTTPSession{
static AFHTTPSessionManager *_manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_manager = [AFHTTPSessionManager manager];
});
return _manager;
}
2>方式二:static修饰的全局
// 用来保存唯一的单例对象
static id _instace;
+ (instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[self alloc] init];
});
return _instace;
}
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}
- (id)copyWithZone:(NSZone *)zone
{
return _instace;
}