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底层内部模 ...
随机推荐
- alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
大家好! 多语言实现的案例:http://alidoing.com/或者http://www.alidoing.com/ 图:切换语言界面 JS代码实现: 1.首先新建一个对象langobj,当然对象 ...
- ranorex官网
youtube FQ看ranorex https://demo.glyptodon.com 虚拟机 安卓实体 ranorex 只支持 Rxbrowser 我想操作安卓机器上的chrome 所以装了 ...
- cobbler dell r730安装问题(四)
环境介绍: 服务器硬件:dell-13代 R730 Intel xeon E5-2600系列CPU:E5-2609 v4.E5-2620 v4.E5-2650 v4 cobbler版本:cobbler ...
- 算法理论——Linear SVM
问题引入 下面的三个超平面都起到分类的效果,哪个最好? 答案显然是第三个.为什么? 直觉上,如果现在我们有个测试点,非常靠近右下角的那个红叉叉,也就是说这个点的特征与那个红叉叉非常接近,这时候,我们希 ...
- 爬虫Scrapy框架-Crawlspider链接提取器与规则解析器
Crawlspider 一:Crawlspider简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著 ...
- [python学习篇][python工具使用篇][1] 编辑,设置等
1 添加sublime到环境变量 win +r ,输入sysdm.cpl, 在弹出的界面选择高级,选择环境变量,编辑path,添加sublime的安装目录(这是sublime的一种安装方式,另外一种安 ...
- 刷题总结——旅馆(bzoj1593线段树)
题目: Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N ( ...
- 微信小程序中 input组件影响页面样式的问题
input组件有个默认的宽高,好像是不能清除的,在使用flex布局的时候,发现会影响到页面的布局,以为是flex布局的问题,改为float布局试了下也是同样的问题,试着把input标签换成别的标签,问 ...
- 阶乘-递归-java
public class Main { public static void main(String[] args) { for (int i=0;i<11;i++){ System.out.p ...
- polyfill for Function--源码
/** * polyfill for Function */ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ...