单例
2015-11-20 21:45
489 查看
第一部分: 创建一个
单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。
什么是单例模式?
单例是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
(一
单例设计模式需要达到下面几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法; 3.)提供一个标准的实例访问接口
常用的定义单例的方法(ARC+GCD)
view
sourceprint?
view
sourceprint?
这样,你可以定义一个全局实例变量。
详细请参考:http://blog.csdn.net/casablaneca/article/details/21074413
1.) 在ViewController上设置一个button和一个触发事件
view
sourceprint?
2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化
view
sourceprint?
3.)实现后的效果如图2所示
(图2),
图2: 下边为button事件触发后的场景,上边为初始化时的场景
单例的应用场景:
单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。
什么是单例模式?
单例是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
(一
单例设计模式需要达到下面几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法; 3.)提供一个标准的实例访问接口
常用的定义单例的方法(ARC+GCD)
view
sourceprint?
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中创建实例变量,然后在项目的其他文件中使用这些变量。view
sourceprint?
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和一个触发事件
view
sourceprint?
1.
-(IBAction) refreshData: (id) sender{
2.
//stockForKVO为单例对象
3.
stockForKVO.price = arc4random()%
100
;
4.
}
2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化
view
sourceprint?
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事件触发后的场景,上边为初始化时的场景
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器