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
最新文章
- Ext JS
- 对Web标准的理解。可用性和可访问性
- JAVA课程实验报告 实验二 Java面向对象程序设计
- 如何解决div层被flash遮盖的问题
- SoapUI接口测试实例(webservice接口)
- Android 面试题总结
- WPF:定制Checkbox样式,让“正确”绿得好看,让“错误”红的显眼
- 【转】关于Xcode的Other Linker Flags
- HDU 1285
- java_method_获取数据库中列表的第一行第一列的int值
- 状态模式----C++实现
- JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍
- xPool - 基于mysqlclient的mysql的c++连接池 - xnhcx的个人空间 - 开源中国社区
- 使用TotoriseSVN的分支/标签功能
- Zeppelin 用jdbc连接hive报错
- 【LeetCode】289. Game of Life
- 浅析const、let与var
- mysql授权报错
- Error resolving template [xxx], template might not exist or might not be exist
- mybatis 整合spring之mapperLocations配置的问题(转)
热门文章
- 4.Vim编辑器与Shell命令脚本
- 大数据学习——akka学习
- python学习-- 数据库迁移 python manage.py makemigrations 和 python manage.py migrate
- python学习-- Django根据现有数据库,自动生成models模型文件
- 2017";百度之星";程序设计大赛 - 初赛(B)
- 许式伟看 Facebook 发币(上): 区块链, 比特币与 Libra 币
- bzoj 1061~1065【Noi2008】解题报告
- mybatis学习(六)——参数处理
- iOS-文件断点续传
- Jvm运行时数据区 —— Java虚拟机结构小记