iOS常用设计模式——单例模式

第一部分: 创建一个单例对象

 

单例的应用场景:

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

什么是单例模式?

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

 

单例设计模式需要达到下面几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法; 3.)提供一个标准的实例访问接口

 

常用的定义单例的方法(ARC+GCD)

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //实现一个创建单例对象的类方法  
  2.   
  3. static ClassType *objName = nil;   
  4.   
  5. + (ClassType *) sharedInstance{  
  6. static dispatch_once_t oneToken = 0;  
  7. dispatch_once(&onceToken, ^{  
  8. objName = [[super allocWithZone: NULL] init];  
  9. });  
  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中创建实例变量,然后在项目的其他文件中使用这些变量。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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和一个触发事件

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -(IBAction) refreshData: (id) sender{  
  2. //stockForKVO为单例对象  
  3. stockForKVO.price = arc4random()%100;  
  4. }  

2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.  stockForKVO = [StockData sharedInstance];  
  2.     [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  3.   
  4. //实现回调方法  
  5. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context{  
  6.     if ([keyPath isEqualToString:@"price"]) {  
  7.         showLabel.text = [NSString stringWithFormat:@"%f",stockForKVO.price];  
  8.         NSLog(@" left change: %@", change);  
  9.     }  
  10. }  

3.)实现后的效果如图2所示

 

 

图2: 右边为button事件触发后的场景,左边为初始化时的场景

 

项目的源码下载地址: http://download.csdn.net/detail/luozhonglan/8005001

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值