单例设计模式
2015-08-17 15:43
351 查看
单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例
<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>
总结:
a:单例设计模式用得比较多
b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(1)User.h #import <Foundation/Foundation.h> @interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例) @property(nonatomic,copy) NSString *name; @property(nonatomic,copy) NSString *email; //一般用share或者default做前缀,易于阅读标记为单例共享方法 +(id)shareUser; @end
<2>User.m #import "User.h" static User *user1=nil; //先定义一个空得静态实例 @implementation User +(id)shareUser{ @synchronized(self){ //线程锁,防止多线程访问冲突 if (user1==nil) { //判断这个实例是否为空,即是否已被创建 user1=[[[self class ]alloc]init];//如果没被创建,就初始化一个 } } return user1; //如果已存在,则不创建,直接返回即可 } //以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中 //这是在调用alloc时可防止重复创建实例 +(id)allocWithZone:(NSZone *)zone{ if (user1==nil) { user1=[super allocWithZone:zone]; } return user1; } //这是在拷贝对象时防止重复创建 -(id)copyWithZone:(NSZone *)zone{ return user1; } //这是在retain对象时防止重复创建,当然在ARC开启时可省略这个 -(id)retain{ return user1; } //在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release -(oneway void)release{ } //在autorelease时,返回实例,在ARC下客省略 -(void)autorelease{ return user1; } //返回的时无符号整型,即大于0的数字,在ARC下可省略 -(NSUInteger)retainCount{ return UINT_MAX; } @end
<3>main.m #import <Foundation/Foundation.h> #import "User.h" int main(int argc, const char * argv[]) { @autoreleasepool { User *user1=[User shareUser]; User *user2=[User shareUser]; User *user3=[[User alloc]init]; User *user4=[user1 copy]; NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4); } return 0; }
(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例
<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>
总结:
a:单例设计模式用得比较多
b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
相关文章推荐
- 纯代码利用CSS3 圆角边框和盒子阴影 制作 iphone 手机效果
- innodb master主线程
- 请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间
- SQLite 创建表
- AltiumDesigner99——常用快捷键
- Leetcode#57||Insert Interval
- @property中的属性关键字整理
- [leetcode] 218.The Skyline Problem
- 自定义控制器转场动画及实现下拉菜单的小Demo
- windows下oracle自动备份
- 阻尼滑动--可以滑动过度的ScrollView(OverScrollView)
- Delphi开发学习一:使用ADOConnection控件连接数据库SQL
- java简易图书管理之三层模式
- fir.im Weekly - 工欲善其事,必先利其器
- Jquery-DataTable 使用介绍
- 为OCR和Votingdisk准备rawdevices
- 如果让我重新设计一款Android App
- 漫话C++0x
- linux安装rzsz
- centos下oracle11g的安装与启动