博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的单例模式
阅读量:6295 次
发布时间:2019-06-22

本文共 2354 字,大约阅读时间需要 7 分钟。

什么是单例模式

  • 单例模式 是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。在iOS开发中,单例模式是非常有用的一种设计模式。

  • 可以保证在程序运行过程,一个类只有一个实例


实现单例模式的条件

  • 实现单例模式有三个条件:

    1. 类的构造方法是私有的

    2. 类提供一个类方法用于产生对象

    3. 类中有一个私有的自己对象

  • 针对于这三个条件,OC中都是可以做到的

    1. 类的构造方法是私有的

      我们只需要重写allocWithZone方法,让初始化操作只执行一次

    2. 类提供一个类方法产生对象

      这个可以直接定义一个类方法

    3. 类中有一个私有的自己对象

      我们可以在.m文件中定义一个属性即可


应用场景及注意点

  • 应用场景

    • 某个类经常被使用(节约系统资源)

    • 定义工具类

    • 共享数据

  • 注意点

    • 不要继承单例类

      • 先创建子类永远是子类对象

      • 先创建父类永远是父类对象

  • 单例模式:

    • 懒汉模式 : 第一次用到单例对象的时候再创建

    • 饿汉模式 : 一进入程序就创建一个单例对象

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的环境下,需要再加上下面的方法:

  • 重写release方法为空

  • 重写retain方法返回自己

  • 重写retainCount返回1

  • 重写autorelease返回自己

- (oneway void)release { }- (id)retain { return self; }- (NSUInteger)retainCount { return 1;}- (id)autorelease { return self;}
  • 如何判断是否是ARC

#if __has_feature(objc_arc)//ARC环境#else//MRC环境#endif

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

转载地址:http://navta.baihongyu.com/

你可能感兴趣的文章
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>