爱程序网

读书笔记-常用设计模式之单例

来源: 阅读:

1、单例模式的作用是解决”应用中只有一个实例“的一类问题。

2、在一个iOS应用的生命周期中,有时候我们只需要某个类的一个实例,如果有多个实例就会占用过多的内存。例如当程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例代表了整个”应用程序对象“,它只能是一个实例,其作用是实现程序中一些共享资源的访问和状态的保护等。

3、单例模式一般会封装一个静态属性,并提供静态实例的创建方法。代码如下:

 1 //
 2 //Singleton.h
 3 //
 4 
 5 @interface Singleton : NSObject
 6 
 7 + (Singleton*)sharedManager;
 8 //属性
 9 @property (nonatomic ,strong) NSString* singletonData; 
10 
11 @end
12 
13 -------------------------------------------------------------------------
14 
15 //
16 //Singleton.m
17 //
18 
19 #import "Singleton.h"
20 
21 @implementation Singleton
22  static Singleton *sharedManager = nil;
23 //创建静态实例的方法
24 + (Singleton*)sharedManager
25 {
26     static dispatch_once_t once;
27     dispatch_once(&once, ^{
28         sharedManager = [[self alloc] init];
29     });
30     return sharedManager;
31 }
32 //dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);
33 @end

sharedManager方法我们采用了dispatch_once函数(GCD技术,Grand Central Dispatch,是一种基于C语言的多线程访问技术),它接收一个dispatch_once_t的参数,这个参数GCD提供的结构体,使用时将GCD地址传给dispatch_once函数,这个函数能够记录该代码块是否被调用过。还有一个块参数。对于给定的一个predicate来说,该函数会保证相关的块必定会执行,而且只执行一次,最重要的是这个方法是完全线程安全的,就不需要线程锁@synchronized之类的语句。需要注意的是,对于只需要执行一次的块来说,传入的predicate必须是完全相同的,所以predicate常常会用static或者global来修饰。这样写代码简单清晰,而且做到了线程安全,这样实现的效率也很高。

4、在Cocoa Touch框架中,有UIApplication、UIaccelerometer、NSUserDefaults和NSNotificationCenter等单例。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用。(Cocoa框架中的单例类有NSFileManager、NSBundle、NSWorkspace和NSApplication等)。 

4.1、UIApplication

UIApplication类的实例提供了应用程序的集中控制点来保持应用的状态。UIApplication实例总是分配给应用程序委托对象(UIApplicationDelegate),通过应用程序委托对象来响应低内存、应用启动、后台运行和应用终止等时间。下面我们重点介绍这个类的几个方法和属性。

4.1.1 + sharedApplication方法。创建和获得UIApplication实例的方法。

4.1.2 idleTimerDisabled属性。设定和获得“空闲时间禁止”的状态。默认值是NO,即默认情况下系统会锁定屏幕。

4.1.3 - openURL:方法。可以打开一些内置的iOS应用,其中包括打开浏览器、打开地图、拨打电话、发送短信和发送E-mail。

 1 //打开浏览器
 2 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
 3 [[UIApplication sharedApplication] openURL:url];
 4 
 5 //打开Google地图时,实际上是通过内置浏览器打开的。
 6 NSString* searchQuery = @"中国西安