iOS常用设计模式之单例模式
单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的作用就是为了解决“应用中只有一个实例”这一类问题。
单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:
// // Singleton.h // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import @interface Singleton : NSObject + (Singleton *)shareManager; @end
// // Singleton.m // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import "Singleton.h" @implementation Singleton static Singleton *_shareManager = nil; + (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager; } @end
如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:
1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。
2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。
3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)
重新改造的单例如下:
// // Singleton.m // DesignPatternsDemo // // Created by 韩学鹏 on 15/6/19. // Copyright (c) 2015年 韩学鹏. All rights reserved. // #import "Singleton.h" @implementation Singleton static Singleton *_shareManager = nil; + (Singleton *)shareManager { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [[self alloc] init]; }); return _shareManager; } + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t once; dispatch_once(&once, ^{ _shareManager = [super allocWithZone:zone]; }); return _shareManager; } - (id)copyWithZone:(NSZone *)zone { return _shareManager; } - (id)mutableCopyWithZone:(NSZone *)zone { return [self copyWithZone:zone]; } /* ARC无效时 - (id)retain { return _shareManager; } - (NSUInteger)retainCount { return 1; } - (oneway void)release { } - (id)autorelease { return _shareManager; } */ @end
测试代码和输入输出结果:
id obj = [Singleton new]; id obj1 = [Singleton shareManager]; id obj2 = [[Singleton alloc] init]; NSLog(@"obj:%@", obj); NSLog(@"obj1:%@", obj1); NSLog(@"obj2:%@", obj2);
输出:
2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:
附上这个类的下载地址:单例