设计模式-单例模式

单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?

简单来说:

a:有的东西只能有一个,那就必须用单例;

b:单例的好处就是不会有多余的实例,所以节约内存;

c:因为只有一个单例,所以易于管理多线程对它的访问。

d:其他的原因……省略

我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?

(1)User.h

1. #import <Foundation/Foundation.h>
2.  
3. @interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
4. @property(nonatomic,copy) NSString *name;
5. @property(nonatomic,copy) NSString *email;
6. //一般用share或者default做前缀,易于阅读标记为单例共享方法
7. +(id)shareUser;
8. @end

(2)User.m
01. #import "User.h"
02. static User *user1=nil; //先定义一个空得静态实例
03. @implementation User
04. +(id)shareUser{
05. @synchronized(self){ //线程锁,防止多线程访问冲突
06. if (user1==nil) { //判断这个实例是否为空,即是否已被创建
07. user1=[[[self class ]alloc]init];//如果没被创建,就初始化一个
08. }
09. }
10. return user1; //如果已存在,则不创建,直接返回即可
11. }
12.  
13. //以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
14. //这是在调用alloc时可防止重复创建实例
15. +(id)allocWithZone:(NSZone *)zone{
16. if (user1==nil) {
17. user1=[super allocWithZone:zone];
18. }
19. return user1;
20. }
21. //这是在拷贝对象时防止重复创建
22. -(id)copyWithZone:(NSZone *)zone{
23. return user1;
24. }
25. //这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
26. -(id)retain{
27. return user1;
28. }
29. //在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
30. -(oneway void)release{
31.  
32. }
33. //在autorelease时,返回实例,在ARC下客省略
34. -(void)autorelease{
35. return user1;
36. }
37. //返回的时无符号整型,即大于0的数字,在ARC下可省略
38. -(NSUInteger)retainCount{
39. return UINT_MAX;
40. }
41. @end

(3)main.m
01. #import <Foundation/Foundation.h>
02. #import "User.h"
03.  
04. int main(int argc, const char * 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. return 0;
14. }

(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例

<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>

总结:

a:单例设计模式用得比较多

b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值