单例Singleton
先提供一个完整版:
// .h文件 @interface SingleTon : NSObject /** 获取单例对象*/ + (instancetype)sharedInstance; + (instancetype)new __attribute__((unavailable("new unavailable, call sharedInstance instead"))); - (instancetype)init __attribute__((unavailable("init unavailable, call sharedInstance instead"))); + (instancetype)alloc __attribute__((unavailable("alloc unavailable, call sharedInstance instead"))); @end// .m文件 static SingleTon *_instance; @implementation SingleTon + (instancetype)sharedInstance {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [[super alloc] initInstance];});return _instance; }- (instancetype)initInstance {return [super init]; }+ (instancetype)allocWithZone:(struct _NSZone *)zone {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [super allocWithZone:zone];});return _instance; }- (id)copyWithZone:(NSZone *)zone {return _instance; } @end
建议构造单例对象时,禁止调用系统的alloc、init等方法。以防止新加入的程序员在调用时出现问题;
下面来如何说说‘禁用’init等方法:
1、Clang特性(推荐,xcode不会联想该方法)
- (instancetype)init __attribute__((unavailable("init unavailable, call sharedInstance instead")));
2、使用apple提供的宏
- (instancetype)init NS_UNAVAILABLE;
3、在.m的 init中实现:
- (instancetype)init {[super doesNotRecognizeSelector:_cmd];return nil; }
若init方法被调用了,则抛出异常信息:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestManager init]: unrecognized selector sent to instance 0x600000001150'
4、断言或使用NSException,在init被调用时,则抛出异常信息
// NSAssert断言 - (instancetype)init {NSAssert(false,@"init unavailable, use sharedInstance instead");return nil; }// NSException - (instancetype)init {[NSException raise:NSGenericExceptionformat:@"init unavailable. use +[%@ %@] instead",NSStringFromClass([self class]),NSStringFromSelector(@selector(sharedInstance))];return nil; }
参考:http://stackoverflow.com/questions/5720029/create-singleton-using-gcds-dispatch-once-in-objective-c
转载于:https://www.cnblogs.com/xiu619544553/p/5916812.html
单例Singleton相关推荐
- 设计模式--单例(Singleton)模式
模式意图 保证一个类只用一个实例,并且提供一个全局访问点 类图 应用场景 1.需要更严格地控制全局变量时,使用单例模式: 2.重量级的对象如线程池对象,数据库连接池对象,不需要多个实例的对象如工具类等 ...
- 设计模式学习笔记——单例(Singleton)模式
设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...
- Ruby设计模式透析之 —— 单例(Singleton)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- 跨应用程序域(AppDomain)的单例(Singleton)实现
转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...
- 枚举实现单例singleton
枚举不仅可以解决线程同步问题, 还可以防止反序列化(没有构造方法), 也就是无法通过反射的方式创建出对象. 目前为止, 枚举是最好的实现单例的方式, 但是比较别扭, 明明是一个类, 非得定义成一个枚举 ...
- Objective-C设计模式——单例Singleton(对象创建)
单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...
- 设计一个线程安全的单例(Singleton)模式
在设计单例模式的时候.尽管非常easy设计出符合单例模式原则的类类型,可是考虑到垃圾回收机制以及线程安全性.须要我们思考的很多其它.有些设计尽管能够勉强满足项目要求,可是在进行多线程设计的时候.不考虑 ...
- java EE单例Singleton自启动
多个单例随服务自启动(指定各个单例启动的顺序)@DependsOn("单例类名称")/@DependsOn({"单例类名称1","单例类名称2&quo ...
- java singleton 多线程_Java创建线程安全的单例singleton
Java创建线程安全的单例 单例的使用场景 JVM中仅需要一个实例,因此能节省内存,加快访问速度,比如数据库连接池,计数器等.Spring 中的Bean,默认也是单例的,共享资源的访问,比如日志文件, ...
最新文章
- 【转】浅谈php://filter的妙用
- 农商互联农民丰收节交易会-万祥军:产销对接谋定功能农业
- 好看的论文千篇一律,有趣的Github项目万里挑一!
- 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式
- 2017-03-10Git版本回退
- Splash resource_timeout 属性
- ocx控件 postmessage消息会消失_通过HackerOne漏洞报告学习PostMessage漏洞实战场景中的利用与绕过...
- [序列化] SerializeHelper--序列化操作帮助类 (转载)
- Python基础笔记(手写版)
- Ubuntu22.04中解决Wine通达信版行情软件侧边栏显示异常的问题
- Unity3D游戏开发中相见恨晚的动画插件
- 微信H5开发问题集锦
- mysql双机热备份
- matlab极坐标图刻度,[转载]如何在Matlab极坐标polar绘图上增加刻度单位
- 计算机更改开机密码快捷方法,win7怎么修改开机密码(最快) win7修改开机密码最便捷的方法...
- raid卷的作用_raid是什么?为什么要用raid?有好什么好处?
- Quartus | FPGA开发工具(Inter系列芯片)
- 如何争取APP Store推荐位
- 萌新python爬虫初学
- ssm+redis整合(通过cache方式)
热门文章
- Java--语言基础
- 前后端分离微服务架构如何设计?
- Struts2 为什么被淘汰?自己作死!
- 支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
- (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
- Google MapReduce架构设计
- Windows下配置NodeJS环境详解
- MySQL: load data infile 需要注意的点
- Redis持久化:AOF和RDB