两种单例的实现方式

在IOS中单例设计模式有很广泛的用途,它保证一个类只有一个实例,并提供一个访问它的全局访问点,一个app只有一个实列,也就是说他一直存在,除非你手动置空,在内存里面也只会用到一个地址.

苹果官方提供了很多单列对象供用户使用,例如:

- UIApplication 类提供了 +sharedApplication 方法创建和获取 UIApplication 单例.
- NSBundle 类提供了 +mainBundle 方法获取 NSBundle 单例.
- NSFileManager 类提供了 +defaultManager 方法创建和获得 NSFileManager 单例(使用代理时需要调用 -init 实例化方法来实例化一个新的对象).
- NSUserDefaults 类提供了 +defaultUserDefaults 方法去创建和获取 NSUserDefaults 单例.
- NSNotificationCenter 类提供了 +defaultCenter 方法创建和获取 NSNotificationCenter 单例.

我所知道的单例有两种实现方式,根据线程安全的实现来区分的话,一种是使用@synchronized,另一种是使用GCD的dispatch_once函数。

synchronized线程锁的方式
+(instancetype)sharedPersonSync{
    static id instance;
    @synchronized(self) {
        if(instance == nil){
            instance = [[self alloc] init];
        }
    }
    return instance;
}
GCD方式
+(instancetype)sharedPerson{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

Warning:单例虽然可以达到共享传值的目的,但非必要的情况下最好不要使用单例的方式实例化对象.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在IOS中单例设计模式有很广泛的用途,它保证一个类只有一个实例,并提供一个访问它的全局访问点,一个app只有一个实...
    sunmumu1222阅读 187评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,299评论 4 34
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 6,891评论 12 68
  • 我喜欢安静 也不喜欢安静 我喜欢甜食 也不喜欢甜食 我喜欢酸的 也不喜欢酸的 我喜欢你 但我并不爱你
    三哥讲故事阅读 226评论 1 3