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

 

 

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术Dog|博客
原文地址:《iOS中的单例模式》 发布于2019-09-21

分享到:
赞(0) 打赏

评论 抢沙发

6 + 1 =


iOS中的单例模式

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?