iOS-设计模式-单例

来聊聊关于设计模式,首先来说说单例,这个是我们面向对象最最最常见的一种设计模式吧,一般适用于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;
}

你可能感兴趣的:(iOS-设计模式-单例)