单例模式,顾名思义,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
oc中常用于 文件,数据库等。
最基本的oc写法:
-(instancetype)defaultInstance { static InstanceType instance; if (instance == nil) { instance = [[InstanceType alloc]init]; } return instance; }
但是这样的写法是有问题的,因为我们没有对其他初始化方法进行重写。于是在使用[InstanceType defaultInstance] 和[InstanceType alloc]init
得到的对象就不是同一个。
在重写方法之前 我们必须清楚一件事情,alloc内部会调用allocWithZone 在自定义对象的copy中会调用copyWithZone和allocWithZone
那么现在我们开始重写。
-(id)copyWithZone:(NSZone *)zone { Manager * manager = [[Manager alloc]init]; return manager; }
+(id)allocWithZone:(struct _NSZone *)zone { NSLog(@"%@",@"---"); static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [super allocWithZone:zone]; }); return instance; }
调用alloc,copy的代码
-(void)newSingleTon { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"%@",[Manager getManager]); }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ Manager * manager = [Manager getManager]; manager.name = @"sss"; NSLog(@"manager--%@",manager); NSLog(@"%@",[manager copy]); NSLog(@"%@",[[Manager alloc]init]); }); }
此时运行代码的结果为:
2015-09-17 11:09:16.080 02GCDMakeSingleton[970:53274] <Manager: 0x7fa893fa4530> 2015-09-17 11:09:16.080 02GCDMakeSingleton[970:53275] manager--<Manager: 0x7fa893fa4530> 2015-09-17 11:09:16.081 02GCDMakeSingleton[970:53275] <Manager: 0x7fa893fa4530> 2015-09-17 11:09:16.081 02GCDMakeSingleton[970:53275] <Manager: 0x7fa893fa4530>
结果表示 经过重写之后我们可以看到 得到的对象是一个对象。
单例就讨论到这里。
时间: 2024-11-15 02:29:57