Singleton 单例模式 -IOS开发

本文详细介绍了Singleton单例模式的概念、思路及在多线程环境下的实现方法。通过实例演示了如何确保单例类在多线程场景下仅创建一次实例,同时解释了为防止并发创建多个实例而引入互斥锁的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明
欢迎转载,但是请尊重作者劳动成果,转载请保留此框内声明,谢谢。
文章出处:http://blog.youkuaiyun.com/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值