单例模式是一种非常常见的设计模式,之前文章中UIApplication就是一种典型的单例模式,单例理解起来叶很简单,就不是不管如果访问始终只有一个实例化对象,定义全局共享的变量,如果对象是空则初始化一个对象,如果对象已经存在则使用已经实例化的对象。单例设计模式的作用是使得这个类的一个对象成为系统中的唯一实例,因此需要用一种唯一的方法去创建这个对象并返回这个对象的地址。下面有一张苹果官网的图片可以参考一下:

定义一个Food类,大家共享同一个食物,定义一个静态变量,一个实例方法:

static Food *sharedFoodObj=nil;+(Food *)sharedFood{if (!sharedFoodObj) {sharedFoodObj=[[Food alloc]init];}return sharedFoodObj;
}

 执行以下代码,最后发现两个实例对象food和foodNext地址是一样的:

 Food  *food=[Food sharedFood];Food  *foodNext=[Food sharedFood];NSLog(@"共享地址:%p-共享地址:%p",food,foodNext);

如果每次都遵守规则调用sharedFood方法,单例模式算是完成了,但是对象是可以实例化的,看一段下面的代码:

    Food  *food=[Food sharedFood];Food  *foodInit=[[Food alloc]init];NSLog(@"共享地址:%p-实例地址:%p",food,foodInit);

 food和foodInit的地址是不一样,这个时候我们需要动手改造以下改成的方法,让实例化对象的出来的地址也是一样的,这个时候需要重写allocWithZone方法:

+(Food *)sharedFood{if (!sharedFoodObj) {sharedFoodObj=[[super allocWithZone:NULL]init];}return sharedFoodObj;
}+(instancetype)allocWithZone:(struct _NSZone *)zone{return [self sharedFood];
}

 如果对象拷贝的时候也需要是同一对象的话,可以加一个方法:

+(id)copyWithZone:(struct _NSZone *)zone{return [self sharedFood];
}

如果为了确保多线程情况下,仍然确保实体的唯一性,这个时候可以加上@synchronized,@synchronized的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。单例模式或者操作类的static变量中使用比较多。当两个并发线程访问同一个对象@synchronized(self)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

+(Food *)sharedFood{@synchronized(self){if (!sharedFoodObj) {sharedFoodObj=[[Food alloc]init];}}return sharedFoodObj;
}

 苹果Mac OS 10.6和iOS4.0后引入了GCD,利用GCD(Grand Central Dispatch)和ARC(Automatic Reference Counting)实现单例,这个时候我们可以通过dispatch_once简单的实现,代码如下:

+ (instancetype)sharedInstance
{static Food *sharedFoodObj = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{sharedFoodObj =[[super allocWithZone:NULL]init];});return sharedFoodObj;
}

Food.m中的代码:

//
//  Food.m
//  Demo
//http://www.cnblogs.com/xiaofeixiang
//  Created by keso on 15/2/8.
//  Copyright (c) 2015年 keso. All rights reserved.
//#import "Food.h"@implementation Foodstatic Food *sharedFoodObj=nil;+(Food *)sharedFood{if (!sharedFoodObj) {sharedFoodObj=[[super allocWithZone:NULL]init];}return sharedFoodObj;
}//
+(id)copyWithZone:(struct _NSZone *)zone{return [self sharedFood];
}- (id)copyWithZone:(NSZone *)zone
{return self;
}+ (instancetype)sharedInstance
{static Food *sharedFoodObj = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{sharedFoodObj =[[super allocWithZone:NULL]init];});return sharedFoodObj;
}+(instancetype)allocWithZone:(struct _NSZone *)zone{return [self sharedInstance];
}@end

iOS的单例通过以上方式可以实现,网上有些文章实现单例用了七个方法,不过自从有了ARC之后,有些方法Apple已经不需要重写,说一个题外话,昨天有个博客园的园友只字不改抄袭了我的文章,文章下面说明栏也说明过了(博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用),本人是自己辛苦所得,抄袭转载麻烦留一个链接,技术文章技术人看,做一个技术人需要有些底线~

iOS开发-单例模式相关推荐

  1. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

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

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

  3. IOS开发基础之单例模式

    IOS开发基础之单例模式 各种编程语言都有单例模式.起初23设计模式是来自C++总结设计出来的.其他编程语言陆续也出来了. 直接上源码.为了方便起见,打印日志我也放到源码里面了. // // View ...

  4. iOS开发-简单工厂模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...

  5. IOS开发系列--IOS程序开发概览

    IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...

  6. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  7. iOS之单例模式的写法

    单例模式是iOS开发中最常用的设计模式,单例需要能达到的目的是: 1. 封装一个共享的资源: 2. 提供一个固定的实例创建方法: 3. 提供一个标准的实例访问接口. iOS中的单例模式有两种写法: 1 ...

  8. 开发必看 | iOS开发常用设计模式!

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  9. IOS开发中的几种设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

最新文章

  1. 使用HTML5监測站点性能
  2. Tiny210编译和烧写u-boot步骤
  3. SpringBoot集成Redis实现排行榜
  4. [云炬创业基础笔记]第九章企业的法律形态测试2
  5. 软件工程个人项目——买书的最低价格
  6. next.js 无法导出及导出图片无法加载等问题
  7. 旅游后台管理系列——使用maven构建工程
  8. MATLAB计算不定积分与定积分
  9. mysql sqlyog 1045_sqlyog错误代码1045
  10. html-前端调用MD5对密码进行加密
  11. P3324 [SDOI2015]星际战争(洛谷刷题记录)
  12. 云计算HCIA学习笔记-云计算基础概念
  13. 基于蜂群对花蜜需求所做的数量模型构建及分析
  14. 论文阅读:**CTF: Anomaly Detection in High-Dimensional Time Series with Coarse-to-Fine Model Transfer
  15. [Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图像案例分析
  16. 码元,数据传输速率,带宽,信噪比,信道容量
  17. impala理论篇之三:impala介绍
  18. private static final long serialVersionUID=1L 是什么意思
  19. 微博报错:Ip Limit, request ip is not contained in safety ip error_code:10004/2/status
  20. 分析及解决:虚拟机无法连接虚拟设备idel 0:1 问题

热门文章

  1. php windows应用开发,开发老手谈Windows平台的PHP应用开发
  2. uniapp无法使用substr_SQLite 3.34.0发布,世界上使用量最大的数据库引擎
  3. 禁用计算机服务LanmanServer,计算机关闭默认共享C$D$E$F$ADMIN$IPC$的方法
  4. mysql查询某一时间段之后数据的sql_mysql进阶(十九)SQL语句如何精准查找某一时间段的数据...
  5. mysql性能优化简书_MySQL性能优化
  6. 虚拟机centos7忘记密码怎么办_电脑忘记密码怎么办
  7. 2021年春季学期-信号与系统-第三次作业参考答案
  8. 定位的四个点怎么打_别被忽悠了,轮胎动平衡和四轮定位一定要区分清楚
  9. 方糖全栈课 PHP React大系,方糖全栈课·PHP+React大系
  10. macos关闭软件更新小红点_如何一键消除手机上的小红点?请看这招...