iOS经常使用设计模式——单例模式
第一部分: 创建一个单例对象
单例的应用场景:
单例模式用于当一个类仅仅能有一个实例的时候。 通常情况下这个“单例”代表的是某一个物理设备比方打印机,或是某种不能够有多个实例同一时候存在的虚拟资源或是系统属性比方一个程序的某个引擎或是数据。
用单例模式加以控制是很有必要的。
什么是单例模式?
单例是一种经常使用的软件设计模式。在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在。很多时候整个系统仅仅须要拥有一个的全局对象。这样有利于我们协调系统总体的行为。
单例设计模式须要达到以下几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法。 3.)提供一个标准的实例訪问接口
经常使用的定义单例的方法(ARC+GCD)
//实现一个创建单例对象的类方法 static ClassType *objName = nil; + (ClassType *) sharedInstance{
static dispatch_once_t oneToken = 0;
dispatch_once(&onceToken, ^{
objName = [[super allocWithZone: NULL] init];
});
return objName;
} //重写几个方法。防止创建单例对象时出现错误
-(id) init{
If(self = [super init])
{
//初始化单例对象的各种属性
}
return self;
} +(id)allocWithZone: (struct _NSZone *) zone{
return [self sharedInstance];
} //这是单例对象遵循<NSCopying>协议时须要实现的方法
-(id) copyWithZone: (struct _NSZone *)zone{
return self;
}
第二部分:就地取材使用UIApplication单例
直接在AppDelegate中创建实例变量。然后在项目的其它文件里使用这些变量。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shareApplication] delegate];
appDelegate.a = 10086;
appDelegate.globalString = @”中国想联通’;
这样,你能够定义一个全局实例变量。
具体请參考:http://blog.csdn.net/casablaneca/article/details/21074413
第三部分:在项目中使用单例设计模式
项目描写叙述:我们希望通过一个button的点击事件触发单例对象中的一个属性值发生变化。然后使用KVO在ViewController的两个子视图(LeftView, RightView)上监听这个属性值得变化,并将变化后的数值在LeftView和RightView上显示出来。
1.) 在ViewController上设置一个button和一个触发事件
-(IBAction) refreshData: (id) sender{
//stockForKVO为单例对象
stockForKVO.price = arc4random()%100;
}
2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化
stockForKVO = [StockData sharedInstance];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; //实现回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"price"]) {
showLabel.text = [NSString stringWithFormat:@"%f",stockForKVO.price];
NSLog(@" left change: %@", change);
}
}
3.)实现后的效果如图2所看到的
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FzYWJsYW5lY2E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:274px; height:320px">
图2: 右边为button事件触发后的场景,左边为初始化时的场景
项目的源代码下载地址: http://download.csdn.net/detail/luozhonglan/8005001
iOS经常使用设计模式——单例模式的更多相关文章
- 【iOS 单例设计模式】底层解析与运用
[iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司 单例实例 - 管理 ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- iOS开发多线程篇—单例模式(ARC)
iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 ...
- iOS常用的设计模式
iOS常用的设计模式有:单例模式.委托模式.观察者模式和MVC模式.下面分别简单介绍. 一:单例模式 我们常用的UIApplication.NSUserdefaults.NSNotificationC ...
- 【设计模式】Java设计模式 - 单例模式
[设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
随机推荐
- ogre3D学习基础10 -- 键盘控制与鼠标控制(缓冲控制)
带缓冲的鼠标.键盘操作,这里的鼠标.按键事件会被各自的监听器捕获.其中OIS中定义的两个类MouseListener,KeyListener负责对事件的处理.我们需要使用这两个类的接口. 当一个键被按 ...
- day01_04.变量
变量的命名规则 变量名由字母小写a-z,大写A-Z,_下划线,数字0-9组成,php的变量名区分大小写;python的变量名也是区分大小写的 注意: PHP变量名必须以美元$符号开始; 变量名开头可以 ...
- GCC内嵌汇编一些限制字符串
/******************/ “b”将输入变量放入ebx “c”将输入变量放入ecx “d”将输入变量放入edx “s”将输入变量放入esi “d”将输入变量放入edi “q”将输入变量放 ...
- LiveScript 流程控制、循环以及列表推导式
The LiveScript Book The LiveScript Book Generators and Yield 你可以在你的 LiveScript 代码中使用 Ecmascript ...
- Nginx报 No input file specified. 的问题解决之路 转
https://m.aliyun.com/yunqi/articles/34240 今天接手公司的一个项目,照例将项目clone下来,配置本地host,nginx,然后访问. 怎么回事?迅速在php的 ...
- BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】
题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...
- 【bzoj3098】Hash Killer II 生日悖论
这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:给你一个长度为N的字符串S,求有多少个不同的长度为L的子串.子串的定义是S[l].S[l + 1].… S[r]这样连续的一段.两个字 ...
- ace模板dataTables_length控制是否显示分页
默认的ace中配置的是7列之后才显示分页的,其实是可控的,如下: aoColumns这个参数的含义: 排序控制 $(document).ready(function() {$('#example'). ...
- Date对象在苹果手机下兼容问题的解决方法
Date在不同浏览器中对于传入的时间字符串的格式要求是不一样的.比如在chrome浏览器的控制台中输入以下内容,会得到相应结果: Date.parse('2015-11-11 00:00:00') / ...
- Codevs 3578 无线网络发射器选址== NOIP 2014 Day2 T1
3578 无线网络发射器选址 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题目描述 Description 随着智能手机的日益普及,人们对无线网的需求日益增大. ...