单例
来源:互联网 发布:office2010解密软件 编辑:程序博客网 时间:2024/04/30 04:17
单例的应用场景:
单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。
什么是单例模式?
单例是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
(一
单例设计模式需要达到下面几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法; 3.)提供一个标准的实例访问接口
常用的定义单例的方法(ARC+GCD)
01.
//实现一个创建单例对象的类方法
02.
03.
static
ClassType *objName = nil;
04.
05.
+ (ClassType *) sharedInstance{
06.
static
dispatch_once_t oneToken =
0
;
07.
dispatch_once(&onceToken, ^{
08.
objName = [[
super
allocWithZone: NULL] init];
09.
});
10.
return
objName;
11.
}
12.
13.
//重写几个方法,防止创建单例对象时出现错误
14.
-(id) init{
15.
If(self = [
super
init])
16.
{
17.
//初始化单例对象的各种属性
18.
}
19.
return
self;
20.
}
21.
22.
+(id)allocWithZone: (struct _NSZone *) zone{
23.
return
[self sharedInstance];
24.
}
25.
26.
//这是单例对象遵循<NSCopying>协议时需要实现的方法
27.
-(id) copyWithZone: (struct _NSZone *)zone{
28.
return
self;
29.
}
第二部分:就地取材使用UIApplication单例
直接在AppDelegate中创建实例变量,然后在项目的其他文件中使用这些变量。
1.
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shareApplication] delegate];
2.
appDelegate.a =
10086
;
3.
appDelegate.globalString = @”中国想联通’;
这样,你可以定义一个全局实例变量。
详细请参考:http://blog.csdn.net/casablaneca/article/details/21074413
第三部分:在项目中使用单例设计模式
项目描述:我们希望通过一个button的点击事件触发单例对象中的一个属性值发生变化,然后使用KVO在ViewController的两个子视图(LeftView, RightView)上监听这个属性值得变化,并将变化后的数值在LeftView和RightView上显示出来。
1.) 在ViewController上设置一个button和一个触发事件
1.
-(IBAction) refreshData: (id) sender{
2.
//stockForKVO为单例对象
3.
stockForKVO.price = arc4random()%
100
;
4.
}
2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化
01.
stockForKVO = [StockData sharedInstance];
02.
[stockForKVO addObserver:self forKeyPath:@
"price"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
03.
04.
//实现回调方法
05.
- (
void
)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(
void
*)context{
06.
if
([keyPath isEqualToString:@
"price"
]) {
07.
showLabel.text = [NSString stringWithFormat:@
"%f"
,stockForKVO.price];
08.
NSLog(@
" left change: %@"
, change);
09.
}
10.
}
3.)实现后的效果如图2所示
(图2),
图2: 下边为button事件触发后的场景,上边为初始化时的场景
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 单例
- 多线程中使用Socket Server的问题
- Struts标签里的type属性
- 通信制式知识
- Camera Models摄像机模型 world coordinate frame
- php引入lucene搜索引擎方法.
- 单例
- Python计算机视觉编程练习6:文本、列表操作
- java基础之异常
- windows10打不开nginx应该怎么办?
- 大整数的四则运算
- 初入IT
- 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib
- 数据库连接池理论研究总结
- Myeclipse下tomcat报错publishing to tomcat.......