iOS单例模式

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

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

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

怎样创建一个单例?

定义一个全局变量:

static Singleton * _instance =nil;

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

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

重写系统调用方法

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

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

让我们调用一下:

    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]);

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

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>
时间: 2024-07-28 15:09:40

iOS单例模式的相关文章

谈一谈iOS单例模式_IOS

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 1.书写步骤 1).创建类方法,返回对象实例.以shared  default current开头. 2).创建一个全局变量用来保存对象的引用 3).判断对象是否存在,若不存在,创建对象 2.具体单例模式的几种模式 第一种单例模式 //非线程

IOS单例模式(Singleton)

单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 2.单例模式的优点: 1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例. 2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程   IOS

iOS 博客资源精选

摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/2012/03/18/uiwebview-javascript-communicate-with-cocoa-in-ios/ 2:UIView 你知道多少? http://www.cnblogs.com/likwo/archive/2011/06/18/2084192.html 3:UIWebView s

PHP 单例模式优点意义及如何实现

一.什么是单例模式? 1.含义       作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2.单例模式的三个要点: (1). 需要一个保存类的唯一实例的静态成员变量:private static $_instance;    (2). 构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:private function __construct()   

java两种单例模式用法分析_java

本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法./类全局变量 final:方法或成员变量不能被修饰 1.饿汉式 public class EagerSigleton{ private static final EagerSigleton instance=new EagerSigleton(); private EagerSigleton(){}

JS模式之单例模式基本用法_javascript技巧

本文实例讲述了JS模式之单例模式基本用法.分享给大家供大家参考.具体如下: //singleton var SingletonTester = (function(){ function Singleton(options){ options = options || {}; this.name = "SingletonTester"; this.pointX = options.pointX || 6; this.pointY = options.pointY || 10; }; v

iOS App开发中使用设计模式中的单例模式的实例解析_IOS

一.单例的作用顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次.它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值.UIApplication.NSUserDefaults等都是IOS中的系统单例. 二.单例模式的两种写法 1,常用写法 #import "LGManagerCenter.h" static LGManagerCenter *managerCenter; @implementation LGManagerCen

iOS学习之单例模式

单例模式的作用是解决"应用中只有一个实例"的一类问题. (一)问题的提出 在一个iOS 应用的生命周期中,有时候我们只需要某个类的一个实例.例如,iOS 设备都有一个重力加速计硬件设备,要访问设备在x轴.y轴和z轴上的重力加速度,就必然要有一个类能够与硬件设备沟通来实时获得这些数据,这个类就是UIAccelerometer .除了实时地获得数据,该类还能够保持x 轴.y轴和z 轴的状态.但是这个类只需要一个实例就够了,如果有多个实例,就会占用过多的内存. 再有,当应用程序启动时,应用的

iOS设计模式 - 单例模式

IOS设计模式单例类 Made By HeYang 内容大纲: 1.单例模式 2.编写严格的单例 3.利用单例模式优化本地存储 4.重写allocWithZone实现单例 5.使用异常处理强制避免init创建实例 6.MRC下的单例模式,然后宏定义抽取单例类(兼顾ARC和MRC) 7.附录 1.单例模式 单例模式的描述: 系统中的一个类只提供一个实例供外界使用. 下面举几个IOS开发中常用的几个单例: [[UIApplication sharedApplication] statusBarFra