iOS单例模式

简介: 下午帮同事改了一下午的代码,深深的被刺伤了,也深深的觉得代码架构的重要性,更深深的觉得应该好好的打磨一下设计模式。于是乎就钻研一下设计模式由易到难,先从iOS最简单的单例模式说起。

下午帮同事改了一下午的代码,深深的被刺伤了,也深深的觉得代码架构的重要性,更深深的觉得应该好好的打磨一下设计模式。于是乎就钻研一下设计模式由易到难,先从iOS最简单的单例模式说起。

作为iOS最简单的设计模式—单例模式,主要的作用是:

  • 保证了一个类在项目中只有唯一的实例。
  • 节约了资源,减少不必要的开支。

怎样创建一个单例?

定义一个全局变量:

static Singleton * _instance =nil;
AI 代码解读

提供一个类方法接口,供外界调用:

+(instancetype)shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _instance =[[super allocWithZone:NULL]init];
    });
    return _instance;
}
AI 代码解读

重写系统调用方法

我们实例化对象的时候通常会通过alloc、init或者copy的方法,当我们调用alloc方法时,OC内部会调用allocWithZone这个方法来申请内存。拷贝对象也是同样的原理,OC内部调用copyWithZone方法,所以我们需要重写这两个方法,从而保证实例的单一性:

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
      return [Singleton shareInstance];
}
-(instancetype)copyWithZone:(struct _NSZone *)zone
{
      return [Singleton shareInstance];
}
AI 代码解读

让我们调用一下:

    Singleton *obj1=[Singleton shareInstance];

    NSLog(@"obj1=%@",obj1);

    Singleton *obj2=[Singleton shareInstance];

    NSLog(@"obj2=%@",obj2);

    Singleton *obj3=[[Singleton alloc]init];

    NSLog(@"obj3=%@",obj3);

    Singleton *obj4=[[Singleton alloc]init];

    NSLog(@"obj4=%@",[obj4 copy]);
AI 代码解读

打印结果地址一致就大功告成:

2016-03-04 18:26:00.204  obj1=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205  obj2=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205  obj3=<Singleton: 0x7fd4a8406470>
2016-03-04 18:26:00.205  obj4=<Singleton: 0x7fd4a8406470>
AI 代码解读
相关文章
IOS之学习笔记三(简单对象和static和单例)
IOS之学习笔记三(简单对象和static和单例)
125 0
iOS - OC SingleClass 单例类
前言 对于一个单例类,无论初始化单例对象多少次,在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放,并且该对象是全局的,能够被整个系统访问到。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。
909 0
iOS - Swift SingleClass 单例类
前言 单例对象能够被整个程序所操作。对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到。 单例类的创建 1.1 单例类的创建 1 单例类的创建 class SingleClass1 { var text:St...
732 0
IOS:利用dispatch_once创建单例
在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:《IOS学习笔记4—Objective C—创建单例》自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行,还会有更多的更好的方法出现。
811 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等