先提供一个完整版:

// .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相关推荐

  1. 设计模式--单例(Singleton)模式

    模式意图 保证一个类只用一个实例,并且提供一个全局访问点 类图 应用场景 1.需要更严格地控制全局变量时,使用单例模式: 2.重量级的对象如线程池对象,数据库连接池对象,不需要多个实例的对象如工具类等 ...

  2. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  3. Ruby设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  4. 跨应用程序域(AppDomain)的单例(Singleton)实现

    转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...

  5. 枚举实现单例singleton

    枚举不仅可以解决线程同步问题, 还可以防止反序列化(没有构造方法), 也就是无法通过反射的方式创建出对象. 目前为止, 枚举是最好的实现单例的方式, 但是比较别扭, 明明是一个类, 非得定义成一个枚举 ...

  6. Objective-C设计模式——单例Singleton(对象创建)

    单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...

  7. 设计一个线程安全的单例(Singleton)模式

    在设计单例模式的时候.尽管非常easy设计出符合单例模式原则的类类型,可是考虑到垃圾回收机制以及线程安全性.须要我们思考的很多其它.有些设计尽管能够勉强满足项目要求,可是在进行多线程设计的时候.不考虑 ...

  8. java EE单例Singleton自启动

    多个单例随服务自启动(指定各个单例启动的顺序)@DependsOn("单例类名称")/@DependsOn({"单例类名称1","单例类名称2&quo ...

  9. java singleton 多线程_Java创建线程安全的单例singleton

    Java创建线程安全的单例 单例的使用场景 JVM中仅需要一个实例,因此能节省内存,加快访问速度,比如数据库连接池,计数器等.Spring 中的Bean,默认也是单例的,共享资源的访问,比如日志文件, ...

最新文章

  1. 【转】浅谈php://filter的妙用
  2. 农商互联农民丰收节交易会-万祥军:产销对接谋定功能农业
  3. 好看的论文千篇一律,有趣的Github项目万里挑一!
  4. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式
  5. 2017-03-10Git版本回退
  6. Splash resource_timeout 属性
  7. ocx控件 postmessage消息会消失_通过HackerOne漏洞报告学习PostMessage漏洞实战场景中的利用与绕过...
  8. [序列化] SerializeHelper--序列化操作帮助类 (转载)
  9. Python基础笔记(手写版)
  10. Ubuntu22.04中解决Wine通达信版行情软件侧边栏显示异常的问题
  11. Unity3D游戏开发中相见恨晚的动画插件
  12. 微信H5开发问题集锦
  13. mysql双机热备份
  14. matlab极坐标图刻度,[转载]如何在Matlab极坐标polar绘图上增加刻度单位
  15. 计算机更改开机密码快捷方法,win7怎么修改开机密码(最快) win7修改开机密码最便捷的方法...
  16. raid卷的作用_raid是什么?为什么要用raid?有好什么好处?
  17. Quartus | FPGA开发工具(Inter系列芯片)
  18. 如何争取APP Store推荐位
  19. 萌新python爬虫初学
  20. ssm+redis整合(通过cache方式)

热门文章

  1. Java--语言基础
  2. 前后端分离微服务架构如何设计?
  3. Struts2 为什么被淘汰?自己作死!
  4. 支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
  5. (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...
  6. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
  7. Google MapReduce架构设计
  8. Windows下配置NodeJS环境详解
  9. MySQL: load data infile 需要注意的点
  10. Redis持久化:AOF和RDB