iOS中的单例模式

iOS开发中常用到2中设计模式,分别是代理模式和单例模式,本文主要介绍下单例模式
单例模式的作用
  • 可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问
    从而方便地控制了实例个数,并节约系统资源
单例模式的使用场合
  • 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)

ARC中,单例模式的实现

  • 在.m中保留一个全局的static的实例
static id _instance;
  • 重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
 + (instancetype)allocWithZone:(struct _NSZone *)zone
 {
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         _instance = [super allocWithZone:zone];
     });
     return _instance;
 }
  • 提供1个类方法让外界访问唯一的实例
+ (instancetype)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}
  • 实现copyWithZone:方法
- (id)copyWithZone:(struct _NSZone *)zone
{
    return _instance;
}

非ARC中(MRC),单例模式的实现(比ARC多了几个步骤)

  • 实现内存管理方法
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1; }
- (oneway void)release {}
- (id)autorelease { return self; }
但是我们一个项目中可能需要不同的单例,总是需要写上述重复代码感觉很没有必要,所以抽取一个宏,以后项目中需要单例直接拖过去使用:

Singleton.h


// ## : 连接字符串和参数
#define singleton_h(name) + (instancetype)shared##name;

#if __has_feature(objc_arc) // ARC

#define singleton_m(name) \
static id _instance; \
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
 \
+ (instancetype)shared##name \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    })\
    return _instance; \
} \
+ (id)copyWithZone:(struct _NSZone *)zone \
{ \
    return _instance; \
}

#else // 非ARC

#define singleton_m(name) \
static id _instance; \
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
\
- (oneway void)release \
{ \
\
} \
\
- (id)autorelease \
{ \
return _instance; \
} \
\
- (id)retain \
{ \
return _instance; \
} \
\
- (NSUInteger)retainCount \
{ \
return 1; \
} \
\
+ (id)copyWithZone:(struct _NSZone *)zone \
{ \
return _instance; \
}

#endif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • @WilliamAlex大叔 前言 目前流行的社交APP中都离不开单例的使用,我们来举个例子哈,比如现在流行的"糗...
    Alexander阅读 2,042评论 6 28
  • 单例模式大概是设计模式中最简单的一个。本来没什么好说的,但是实践过程中还是有一些坑。所以本文小结一下在iOS开发中...
    qiushuitian阅读 3,925评论 1 21
  • 单例模式是日常开发工作中经常会用到的一种设计模式。通过单例模式,可以保证程序中的一个类只有一个实例,从而方便对实例...
    狼凤皇阅读 254评论 0 0
  • 单例模式的作用:保证在程序运行过程中,一个类只有一个实例对象,节约系统资源。 单例模式使用场合:在整个应用程序中,...
    Xcode10阅读 433评论 0 0
  • 学习使用思维导图的过程并不难,人们能否使用好它,在很大程度上是由想不想用决定的,而非会不会用。一旦学会使用,它就能...
    小妞丫丫阅读 465评论 0 0

友情链接更多精彩内容