常梦网 常梦网

iOS中的单例模式

时间: 2024-06-09  热度:

什么是单例模式


实现单例模式的条件


应用场景及注意点

ARC


懒汉模式

#import "Singleton.h"@implementation Singletonstatic id _instance;/** *  alloc方法内部会调用这个方法 */+ (instancetype)allocWithZone:(struct _NSZone *)zone{    if (_instance == nil) { // 防止频繁加锁        @synchronized(self) {if (_instance == nil) { // 防止创建多次    _instance = [super allocWithZone:zone];}        }    }    return _instance;}+ (instancetype)sharedSingleton{    if (_instance == nil) { // 防止频繁加锁        @synchronized(self) {if (_instance == nil) { // 防止创建多次    _instance = [[self alloc] init];}        }    }    return _instance;}- (id)copyWithZone:(NSZone *)zone{    return _instance;}@end

饿汉模式(不常用)

#import "HMSingleton.h"@implementation Singletonstatic id _instance;/** *  当类加载到OC运行时环境中(内存),就会调用一次(一个类只会加载1次) */+ (void)load{    _instance = [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{    if (_instance == nil) { // 防止创建多次        _instance = [super allocWithZone:zone];    }    return _instance;}+ (instancetype)sharedSingleton{    return _instance;}- (id)copyWithZone:(NSZone *)zone{    return _instance;}@end

GCD实现单例模式

@implementation Singletonstatic id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [super allocWithZone:zone];    });    return _instance;}+ (instancetype)sharedSingleton{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [[self alloc] init];    });    return _instance;}- (id)copyWithZone:(NSZone *)zone{    return _instance;}@end

非ARC

在非ARC的环境下,需要再加上下面的方法:

- (oneway void)release { }- (id)retain { return self; }- (NSUInteger)retainCount { return 1;}- (id)autorelease { return self;}
#if __has_feature(objc_arc)//ARC环境#else//MRC环境#endif

更多关于iOS学习开发的文章请登陆我的个人博客www.zhunjiee.com,欢迎前来参观学习

相关阅读