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

 

 

人已赞赏
iOS文章

iOS-可拉伸放大的UITableView头部视图

2019-9-21 22:46:19

iOS文章

iOS-常用第三方库

2019-9-21 23:40:47

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索