ios设计模式——单例模式

一、定义


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

  如何保证只能创建一个实例

二、使用


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

三、代码


  • 方法一

     1 #import "Singleton.h"
     2
     3 @implementation Singleton
     4
     5 static Singleton * shared = nil;
     6
     7 + (Singleton *)sharedInstance
     8 {
     9     static dispatch_once_t once;
    10     dispatch_once(&once, ^{
    11             shared = [[super allocWithZone:NULL] init];
    12     });
    13
    14     return shared;
    15 }
    16
    17 + (instancetype)allocWithZone:(struct _NSZone *)zone
    18 {
    19     return [self sharedInstance];
    20 }
    21
    22 @end

  调用:

 1        Singleton * single = [[Singleton alloc] init];
 2         NSLog(@"%@", single);
 3
 4         Singleton * sing = [Singleton sharedInstance];
 5         NSLog(@"%@", sing);
 6
 7         Singleton * single1 = [[Singleton alloc] init];
 8         NSLog(@"%@", single1);
 9
10         Singleton * sing1 = [Singleton sharedInstance];
11         NSLog(@"%@", sing1);

输出结果:

这样,当我们调用alloc的时候,会自动调用+ (instancetype)allocWithZone:(struct _NSZone *)zone方法,调用这个方法的时候,就会调用sharedInstance方法,所以这样不管什么时候使用这个类,最终都是由sharedInstance返回的,而且,sharedInstance方法,只初始化该对象一次,所以返回的地址都是一样的。

  • 方法二
 1 #import "Singleton.h"
 2
 3 @implementation Singleton
 4
 5 static Singleton * shared = nil;
 6
 7 + (Singleton *)sharedInstance
 8 {
 9     if(shared == nil){
10         shared = [[self alloc] init];
11     }
12     return shared;
13 }
14
15 + (instancetype)allocWithZone:(struct _NSZone *)zone
16 {
17     static dispatch_once_t once;
18     dispatch_once(&once, ^{
19         shared = [[super allocWithZone:zone] init];
20     });
21
22     return shared;
23 }
24
25 @end

方法一和方法二,执行的效果是一样的,只是函数的执行数序是不同的,方法一不管调用哪个方法,最后调用的一个是sharedInstance,而方法二,不管调用哪一个函数,最终调用的是allocWithZone。其实底层实现都是一样的,最终都由[[super allocWithZone:zone] init]返回一个地址给static对象。

时间: 09-17

ios设计模式——单例模式的相关文章

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

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么翻译错误,请与我联系谢谢. iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不会太关注它. 在软件设计领域,设计模式是对通用问题

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

iOS 的单例模式 dispatch_once

iOS 的单例模式 dispatch_once 有些变量只需要初始化一次(如从文件中读取配置参数,读取设备型号等等),可以使用dispatch_once来进行读取优化,保证只调用API一次,以后就只要直接访问变量即可. WeatherClient.h #import "AFHTTPClient.h" @interface WeatherClient : AFHTTPClient +(WeatherClient *)sharedClient; @end WeatherClient.m #

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

iOS设计模式

iOS设计模式,很多开发这都是听得多,但是有时候自己即使用过也不会很在意,开发者在写代码的时候也不会注意它. 在软件设计领域,设计模式是对通过问题的可复用的解决方案.设计模式是一系列帮你写出可理解和复用的模板,设计模式帮你创建松耦合的代码,你不需要花费太多就可以改变或者替换代码中的组件. (1)代理模式 应用场景:当一个类的某些功能需要由其他别的类别来实现的,但是又不确定是哪个类 优势:松耦合 实例:tableView的数据源delegate,通过和protocol的配合,完成委托. 列表row

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

iOS 设计模式

Ios 设计模式,你可能听说过,但是你真正知道这是什么意思么?大部分的开发者大概都同意设计模式很重要,但是关于这一部分却没有很多的文章去介绍它,我们开发者很多时候写代码的时候也并不重视设计模式. 设计模式是在软件设计上去解决普通问题的可重用的方法.他们是是帮助你让所写的代码更加容易理解和提高可重用性的模板.它们还可以帮你创建松散耦合的代码是你能不费很大功夫就可以改变或者替代你的代码中的一部分. 如果你对设计模式感到生疏,那么我有个好消息告诉你!首先,你已经用了很多ios设计模式多亏了Cocoa

iOS的单例模式(singleton)

自从设计模式出现以后,关于单例模式的争执就一直存在.我们很多时候需要一个全局的东西,保证全局仅有一份即可,这个时候单例是最佳的选择,但在多线程的环境下也需要做好线程保护. 在iOS下的UIApplication和NSFileManager就是很不错的例子--我们总有时候需要用到单例模式.不过写起代码来还是值得推敲一下: 最简单的例子如下,假设我们有一个testClass的类需要实现单例: + (id)sharedInstance { static testClass *sharedInstanc

iOS设计模式 - 概述

最近可自由安排的时间比较多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 因为我自己是搞iOS的, 所以之后设计代码部分, 将尽量与objective-c相结合. iOS设计模式 - 概述           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40372113 一.定义 设计模式(Des