OC学习-单例设计模式的理解、案例和简单总结
2015-07-21 00:04
417 查看
单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(1)User.h
view sourceprint?
(2)User.m
view sourceprint?
(3)main.m
view sourceprint?
(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例
<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>
总结:
a:单例设计模式用得比较多
b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(1)User.h
view sourceprint?
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
view sourceprint?
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
view sourceprint?
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等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
相关文章推荐
- 运行hbm2java工具和hbm2ddl工具
- C#6.0中10大新特性的应用和总结
- ASP.NET通过自定义函数实现对字符串的大小写切换功能
- 页面编码codepage=936和65001的区别
- 剖析Django中模版标签的解析与参数传递
- 详解Python的Django框架中inclusion_tag的使用
- 编写自定义的Django模板加载器的简单示例
- 举例讲解Django中数据模型访问外键值的方法
- Django的数据模型访问多对多键值的方法
- 通过数据库对Django进行删除字段和删除模型的操作
- 详解Python的Django框架中Manager方法的使用
- 在Django的模型中添加自定义方法的示例
- 在Django的模型中执行原始SQL查询的方法
- 在Python的Django框架中使用通用视图的方法
- Django框架中的对象列表视图使用示例
- 在Django的通用视图中处理Context的方法
- 在Python的Django框架中显示对象子集的方法
- 详解Django通用视图中的函数包装
- php 把数字转换成汉字的代码
- 解决nginx不支持thinkphp中pathinfo的问题