单例设计模式
单例设计模式
基本概念
单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例。
创建单例的基本步骤
- 声明一个单例对象的静态实例
- 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时。
- 覆盖 allocWithZone: 方法,确保用户程序员在直接分配和初始化对象时,不会产生另一个对象。
- 实现 NSCopying 协议,覆盖 release,autorelease,retain,retainCount 方法,以此确保单例的状态。
- 在多线程的环境中,注意使用@synchronized 关键字,确保静态实例被正确的创建和实例化。
单例基本实现
static UserContext *segtonInstance = nil; @implementation UserContext +(id)shareUserContext{ @synchronized(self){ //线程安全 if (segtonInstance == nil) { segtonInstance = [[[self class] alloc] init]; } } return segtonInstance; } //重写 allocWithZone: 方法 +(id)allocWithZone:(NSZone *)zone{ if (segtonInstance == nil) { segtonInstance = [super allocWithZone:zone]; } return segtonInstance; } - (id)copyWithZone:(NSZone *)zone { return segtonInstance; }
//覆盖 release,autorelease,retain,retainCount 方法方法 //返回本身 -(id)retain { return self; } -(NSInteger)retainCount { return UINT_MAX; } -(id)autorelease{ return self; } -(oneway void)release { }
//验证单例 UserContext *user1 = [UserContext shareUserContext]; UserContext *user2 = [UserContext shareUserContext]; UserContext *user3 = [[UserContext alloc] init]; UserContext *user4 = [[UserContext alloc] init]; UserContext *user5 = [[UserContext copy]; NSLog(@"%@",user1); NSLog(@"%@",user2); NSLog(@"%@",user3); NSLog(@"%@",user4); NSLog(@"%@",user5);