您的位置:首页 > 移动开发 > IOS开发

单例

2015-11-20 21:45 489 查看
第一部分: 创建一个

 

单例的应用场景:

单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。

什么是单例模式?

单例是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。


(一

 

单例设计模式需要达到下面几个目的: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事件触发后的场景,上边为初始化时的场景
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS