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底层内部模 ...
随机推荐
- luogu2761 软件补丁问题
状压最短路 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...
- java中,为什么char类型数组可以直接用数组名打印,打印结果居然不是地址值!
char类型的数组就相当于一个字符串. 因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void print ...
- Apache不能启动: Unable to open logs
日志名称: Application来源: Apache Service日期: 2014/3/12 14:43:21事件 ID: ...
- xml编辑无提示?这么破!
在学习testng这个单元测试框架时,如果咱们碰到了编辑测试套件xml,不提示的情况(有提示方便咱们学习,并且testng的测试套件定义必须按照他的dtd文件约束来),咱们可以按照下面的步骤去解决这个 ...
- [adb 学习篇] python将adb命令集合到一个工具上
https://testerhome.com/topics/6938 qzhi的更全面,不过意思是一样的,另外补充一个开源的https://github.com/264768502/adb_wrapp ...
- hiho[Offer收割]编程练习赛30
题目1 : 提取用户名 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在现在的各种互联网应用中,在一段文字中使用'@'字符来提起一名用户是流行的做法. 例如: &quo ...
- RabbitMQ的应用场景以及基本原理介绍(转)
1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现. 2.应用场景 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信, ...
- ubuntu14.04修改mysql默认编码
修改文件为/etc/mysql/my.cnf [client] default-character-set = utf8 (ps:client的设置没变) [mysqld] lower_case_ta ...
- 【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra
题目描述 2255是一个傻X,他连自己家灯不亮了都不知道.某天TZ大神路过他家,发现了这一情况,于是TZ开始行侠仗义了.TZ发现是电路板的问题,他打开了电路板,发现线路根本没有连上!!于是他强大的脑力 ...
- hosts文件位置
windows C:\WINDOWS\system32\drivers\etc mac /etc/hosts 修改hosts文件会遇到无法保存的问题,解法方法参考下文 http://mtoou.inf ...