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 = @"中国西安