单例模式

基础理解

  • 所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失效。
  • 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    *通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是:让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
  • 单例模式的意图是使得类的一个对象成为系统中的唯一实例。

好处

  • 单例模式可以保证唯一的实例。
  • 单例模式因为类本身封装了它的唯一实例,这样它可以严格地控制客户怎么样访问他以及何时访问他。简单来说就是对唯一实例的受控访问。

多线程中的单例

  • 在多线程程序中,多个线程同时,值得注意的是同时访问单例的构造方法,会有可能造成创建多个实例的。所以我们需要把进程加一把锁来处理。lock 是确保当一个线程位于代码的临界区时,另一个线程不进去临界区。如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放。
  • 双重锁定

    我们不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。同时也能保证多线程的安全。这种做法被称为Double-Check Locking(双重锁定)。
  • 饿汉式单例类:静态初始化的方式是在自己被加载时就将自己实例化。
  • 懒汉式单例类:要在第一次被引用时,才会将自己实例化。
  • 懒汉式和饿汉式比较

    由于类一加载就实例化对象,所以要提前占用系统资源。而懒汉式又会面临着多线程访问的安全性问题,需要做双重锁定这样的处理才能保证安全。从C#语言的角度来讲,饿汉式单例类已经满足我们的需求了。

使用单例的情况

  • 类中只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问。
  • 这个唯一的实例只能够通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

在Cocoa Touch中使用单例模式

  • 使用UIApplication类。这是框架中最为常用的一个单例类,他提供了一个控制并协调iOS应用程序的集中点。
  • 使用UIAccelerometer类。该类让应用程序可以进行注册,以接收来自iOS设备内置的加速计的加速度相关数据。应用程序会收到三维空间中沿主轴的线性加速度变化,可以使用这一数据监测设备的当前方向和当前方向的瞬间变化。
  • 使用NSFileManager类。

例子

Singleton.h

//
// Singleton.h
// SingletonDemo
//
// Created by zhanggui on 15/8/6.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import <Foundation/Foundation.h> @interface Singleton : NSObject +(instancetype)sharedInstance;
@end

Singleton.m

//
// Singleton.m
// SingletonDemo
//
// Created by zhanggui on 15/8/6.
// Copyright (c) 2015年 zhanggui. All rights reserved.
// #import "Singleton.h" @implementation Singleton +(instancetype)sharedInstance {
static Singleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
@end

上面这种方式是最安全也是最有效的创建单例的方式。不可能去创建两个实例,而且使100%的线程安全。

总结

  • 几乎在任何的应用程序中,单例模式都极为常用,并不只限于iOS应用程序开发。
  • 只要应用程序需要用集中式的类来协助其服务,这个类就应生成单一的实例,而不是多个实例。

附:

iOS设计模式之单例模式的更多相关文章

  1. iOS设计模式(02):单例模式

    iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象.通过全局的一个入口点对这个实例对象进行访问.在iOS开发 ...

  2. iOS设计模式-单例模式

    (一)什么是单例模式(Singleton) 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中 解读 1> ...

  3. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  4. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  5. iOS设计模式——单例模式

    单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.用单例模式加以 ...

  6. 浅谈iOS中的单例模式

    iOS中的单例模式     就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你 ...

  7. IOS开发中单例模式使用详解

    第一.基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问. 第二.在IOS中使用单例模式的情 ...

  8. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  9. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

随机推荐

  1. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

  2. 编写高质量JS代码的68个有效方法(八)

    [20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  3. canvas剪裁图片并上传,前端一步到位,无需用到后端

    背景: 当前主流的图片剪裁主要有两种实现方式. 1:flash操作剪裁.2:利用js和dom操作剪裁. 目前看来这个剪裁主要还是先通过前端上传图片到服务器,然后前端操作后把一些坐标和大小数据传到后台, ...

  4. [软件] UnicornViewer

    可打开的文件格式有: *.pdg *.tif *.djvu *.djv *.uvz

  5. webapp开发之需要知道的css细节

    引言 首先说明一下,本文分享对象是涉世未深的移动开发者,至于有经验的开发者可以自行绕道. 说来惭愧,做了几年pc端的前端开发,很少接触到webapp的移动端开发.如今有机会参与webapp的开发,发现 ...

  6. UPW学习资料整理 .NET C# 转

    开发工具下载https://www.visualstudio.com/?Wt.mc_id=DX_MVP5000319 Windows 10 UWP开发视频1http://blogs.windows.c ...

  7. UIApplication和delegate代理

    所有的移动操作系统都有个致命的缺点:app很容易受到打扰,比如一个来电或者锁屏都会导致app进入后台甚至被终止 还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这是 ...

  8. Android的init过程(二):初始化语言(init.rc)解析

    Android的init过程(一) 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 在上一篇文章中介绍了init的初始化第一阶段,也就是处理各种属性.在本文将会详细分析i ...

  9. JS 中 this上下文对象的使用方式

    JavaScript 有一套完全不同于其它语言的对 this 的处理机制. 在五种不同的情况下 ,this 指向的各不相同. 有句话说得很在理 -- 谁调用它,this就指向谁 一.全局范围内 在全局 ...

  10. IOS 之 PJSIP 笔记(二) iPJSUA 的简单使用

    上一篇在编译完之后,就很不负责的结束了,本篇就对 PJSIP 库中提供的一个示例 iPJSUA 的使用,做一个简单的介绍.也能解除很多人对官方文档的一个困扰,起码我是被困扰过了. 首先,要确保你的 P ...