单例设计模式(和代理模式同属于设计模式)
- 设计原理:始终返回一个实例,即一个类始终只有一个实例,只初始化一次。
- 意图: 1.这个单例对象作为全局对象 2.避免重量级对象的重复创建
- Foundation用过的对象单例有:NSFileManager
- 声明一个单例对象的静态实例,并初始化为nil
- 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时覆盖allocWithZone:方法,确保用户(程序员)再直接分配和初始化对象时,不会产生另一个对象
- 实现NSCopying协议,覆盖release、autorelease、retain、retainCount方法,以此确保单例的状态。(为了不让它销毁,和修改引用计数)
- 在多线程环境中,注意使用@synchronized关键字,确保静态实例被正确的创建和初始化。
1 //单例的基本实现
2 //定义静态对象和工厂方法
3 static File *shareFile = nil;
4 +(File *)shareFile{
5 @synchronized(self) {
6 //加同步锁,线程保护
7 if (shareFile == nil)
8 {
9 shareFile = [[self alloc] init];
10 }
11 }
12 return shareFile;
13 }
14
15 //覆盖allocWithZone:方法
16 +(id)allocWithZone:(NSZone *)zone{
17 NSLog(@“ nil %p”, zone);
18 @synchronized(self){
19 if(shareFile ==nil){
20 shareFile = [super allocWithZone:zone];
21 return shareFile;
22 }
23 }
24 return shareFile;
25 }
26
27 //实现copy协议,覆盖与内存相关的方法
28 -(id)copyWithZone:(NSZone *)zone{
29 return self;
30 }//实现copy协议,返回本身
31
32 -(id)retain{
33 return self;
34 }//返回本身
35
36 -(NSUInteger)retainCount{
37 return UINT_MAX;
38 }//返回一个无符号整型范围最大值
39
40 -(oneway void)release{}//什么都不做
41
42 -(id)autorelease{return self;}//返回对象本身