单例

iOS单例模式

什么是单例模式?

单例模式:保证一个类仅有一个实例,并提供一个唯一的全局访问点。

苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults],[UIApplication sharedApplication],[UIScreen mainScreen],[NSFileManager defaultManager],所有的这些方法都返回一个单例对象。

单例模式的优缺点

优点

将一些初始化比较耗费资源的类写成单例,避免重复的初始化耗费资源。或者一些创建和销毁比较频繁的类,用单例模式可以提高性能。

单例的唯一性和全局性可以很方便的用来传值。

缺点

单例创建之后,对象保存在静态区,在程序结束之后才会释放,过多的单例会增加常驻内存消耗。

单例的职责过重,在一定程度上违背了“单一职责原则”。

单例没有抽象层,因此单例类的扩展有很大困难。

由于程序的任一模块都可以访问单例,如果某个与单例进行交互的代码出现了问题,很容易影响其他使用到单例的地方。

单例的写法

创建一个单例类,在.h文件声明单例的初始化方法。

+ (instancetype)shareSingleton;

在.m文件里实现,使用static修饰,保证实例全局存在。使用GCD的dispatch_once方法来保证初始化代码只执行一次。

@implementation LDSingletonstatic LDSingleton *instance;+ (instancetype)shareSingleton {    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc]init];    });    return instance;}@end

为了避免在外部使用其他初始化方法创建单例对象,导致单例类有多个实例对象。可以重写allocWithZone:、copyWithZone:和mutableCopyWithZone:方法,并返回唯一的单例对象。

禁用其他获取实例方法

也可以禁用外部调用其他初始化方法,来保证单例的唯一性。在.h文件声明:

- (instancetype)init NS_UNAVAILABLE;+ (instancetype)new NS_UNAVAILABLE;- (id)copy NS_UNAVAILABLE;- (id)mutableCopy NS_UNAVAILABLE;

这些方法不用实现。由于使用NS_UNAVAILABLE宏,在外部调用init等方法时编译器会报错。

一个便捷的可继承单例方法

这有个demo

导入文件:

只要引入头文件,遵守协议就可以成为一个单例类。

#import "NSObject+LDOptionalSingleton.h"@interface Person : NSObject<LDOptionalSingleton>@end

获取单例对象:

[Person LD_sharedSingleton];

原理是使用runtime关联对象方法,加上分类和协议。单例可以继承,并且父类和子类拥有各自的单例对象。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一. ARC环境下的单例模式 单例模式的基本概念单例, 顾名思义, 即在整个程序中, 某一个类只有唯一一个实例, ...
    面糊阅读 803评论 0 50
  • 在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死...
    不要重名就好阅读 595评论 0 0
  • 在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死...
    VincentHK阅读 728评论 0 3
  • iOS-单例模式写一次就够了 一. 单例模式简介 单例模式的作用 可以保证在程序运行过程,一个类只有一个实例,而且...
    Moker_C阅读 418评论 0 1
  • 在开发中经常会用到单例设计模式,目的就是为了在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死...
    零度_不结冰阅读 480评论 0 0

友情链接更多精彩内容