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所示
图2: 右边为button事件触发后的场景,左边为初始化时的场景
项目的源码下载地址: http://download.csdn.net/detail/luozhonglan/8005001
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。