OC学习-单例设计模式的理解、案例和简单总结
-
单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(1)User.h
1.#import<Foundation/Foundation.h>2.3.@interfaceUser : NSObject<NSCopying>//拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)4.@property(nonatomic,copy) NSString *name;5.@property(nonatomic,copy) NSString *email;6.//一般用share或者default做前缀,易于阅读标记为单例共享方法7.+(id)shareUser;8.@end
(2)User.m01.#import"User.h"02.staticUser *user1=nil;//先定义一个空得静态实例03.@implementationUser04.+(id)shareUser{05.@synchronized(self){//线程锁,防止多线程访问冲突06.if(user1==nil) {//判断这个实例是否为空,即是否已被创建07.user1=[[[selfclass]alloc]init];//如果没被创建,就初始化一个08.}09.}10.returnuser1;//如果已存在,则不创建,直接返回即可11.}12.13.//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中14.//这是在调用alloc时可防止重复创建实例15.+(id)allocWithZone:(NSZone *)zone{16.if(user1==nil) {17.user1=[superallocWithZone:zone];18.}19.returnuser1;20.}21.//这是在拷贝对象时防止重复创建22.-(id)copyWithZone:(NSZone *)zone{23.returnuser1;24.}25.//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个26.-(id)retain{27.returnuser1;28.}29.//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release30.-(onewayvoid)release{31.32.}33.//在autorelease时,返回实例,在ARC下客省略34.-(void)autorelease{35.returnuser1;36.}37.//返回的时无符号整型,即大于0的数字,在ARC下可省略38.-(NSUInteger)retainCount{39.returnUINT_MAX;40.}41.@end
(3)main.m01.#import<Foundation/Foundation.h>02.#import"User.h"03.04.intmain(intargc,constchar* argv[])05.{06.@autoreleasepool{07.User *user1=[User shareUser];08.User *user2=[User shareUser];09.User *user3=[[User alloc]init];10.User *user4=[user1 copy];11.NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4);12.}13.return0;14.}
(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>
总结:
a:单例设计模式用得比较多
b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
浙公网安备 33010602011771号