刘伟Derick-IOS应用开发(iPhone iPad 应用、游戏)潇洒的程序员
如果您喜欢可以多留言支持,收藏我的博客。每天都有值得您关注的文章。
声明
欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢。文章出处:http://blog.csdn.net/iukey |
Singleton 单例模式,又叫单子模式,是一种常见的软件设计模式。这种模式的特点就是应用了 Singleton 单例模式的类必须保证始终只有一个实例(对象)存在。许多时候系统中需要某个类只能同时存在一个对象,而且可以全局调用。
单例模式的思路是一个类能返回对象一个实例(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用 getInstance这个名称);当我们调用这个方法时,如果类持有的实例不为空,就返回这个实例;如果类保持的实例为空,就创建该类的实例,并将实例赋予该类保持的实例,从而限制用户只有通过该类提供的静态方法来得到该类唯一的实例。
单例模式在多线程场合下必须小心使用。当唯一的实例未创建时,如果有两个线程同时调用创建方法,那么他们同时没有检测到唯一的实例存在,从而同时各自创建了一个实例,这样就有两个实例被创建出来,从而违反了单例模式中实例唯一的原则。解决这个问题的办法是为标记类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
下面用一个例子来说明问题:
一:为你的单例类声明一个静态的实例,并且初始化它的值为nil。
二:在获取实例的方法中(比如下例中的 getInstance),只有在静态实例为nil的时候,产生一个你的类的实例,这个实例通常被称为共享的实例。
三:重写allocWithZone 方法,用于确定:不能够使用其他的方法来创建我们不得实例,限制用户只能通过获取实例的方法得到这个类的实例。所以,我们在allocWithZone方法中直接返回共享的类实例。
四:实现基本的协议方法 copyWithZone、release、retain、retainCount 和 autorelease,用于保证单例具有一个正确的状态。最后四种方法是哟娜与内存管理的代码,并不适用于垃圾收集代码。
- @implementation TCPClient
- static TCPClient * tcpClient = nil;
- +(TCPClient*)getInstance{
- if (tcpClient == nil) {
- tcpClient = [[super allocWithZone:NULL]init];
- }
- return tcpClient;
- }
- + (id)allocWithZone:(NSZone *)zone{
- return [[self getInstance]retain];//返回单例
- }
- - (id)copyWithZone:(NSZone*)zone{
- return self;
- }
- - (id)retain{
- return self;
- }
- - (NSUInteger)retainCount{
- return NSUIntegerMax;
- }
- - (oneway void)release{///oneway用在分布式对象的API,这些API可以在不同的线程,甚至是不同的程序。oneway关键字只用在返回类型为void的消息定义中, 因为oneway是异步的,其消息预计不会立即返回。
- //什么都不做
- }
- - (id)autorelease{
- return self;
- }
- @end
-
顶
- 116
-
踩
- 0
-
4楼
mr_boog 2013-01-30 18:36发表
-
- +10086
-
3楼
zhaozy55555 2012-12-20 15:25发表
-
- 你的singleton没有考虑到多线程的情况。
-
2楼
电子咖啡 2012-11-03 21:46发表
-
- 请问单利需要释放吗
-
1楼
haburongyi 2012-03-12 20:22发表
-
-
有UML图就好了
-
Re:
iOS开发者 2012-09-24 00:18发表
-
- 回复haburongyi:MAC下面UML图不好画啊,不过一个单例模式我觉得还用不着UML图。
-
- 个人简介
- 文章分类
- IOS开发(所有IOS文章)(71)
- git & svn(0)
- ---控件编程(IOS)(11)
- ---UITableView(IOS表格视图)(2)
- 官方文档(6)
- ---音视频编程(IOS)(4)
- ---网络编程(IOS)(0)
- ---sqlite(IOS)(6)
- Objective-C(17)
- C/C++(12)
- 算法与数据结构(4)
- 设计模式(UML)(2)
- 文章搜索
- 博客专栏
sqlite基础教程 文章:6篇
阅读:19143IOS应用开发词典 文章:5篇
阅读:29438
- 个人资料
-
- 访问:245097次
- 积分:8781分
- 排名:第347名
- 原创:78篇
- 转载:0篇
- 译文:0篇
- 评论:168条