COCOA设计模式——单例模式


一、什么是单例模式
顾名思义,单例模式就是一个类只能有一个实例,它是对象的创建模式之一。

单例模式的几个特点:1、整个类就只有一个实例对象;

                                    2、采用懒加载的方式;

                                    3、对象被创建后就不能销毁,直到整个应用程序退出

cocoa编程中大量使用单例模式,比如UIApplication、NSUserDefault、NSFileManager。使用单例可以减少内存,使得程序只有一个访问点。通常来说,全局对象都最好设计为单例模式。


二、如何实现单例模式
前面提到单例模式只能有一个实例对象,而且该实例对象不能被销毁,那么我们就应该考虑对所有可能创建出新的实例对象的方法进行重写,同时,还应该对release函数进行重写。
创建单例设计模式的基本步骤:
1、 声明一个单例类的静态实例,并初始化为nil.
2、 创建一个类工厂方法,确保用于在直接分配和初始化对象时,不会产生另一个对象
3、 实现NScopying协议,覆盖release、autorelease、retain、retainCount方法,以此确保单例的状态。

4、 在多线程的环境中,注意使用@synchronized关键字,确保静态实例被安全地创建和初始化。


@interface UUIDSingle : NSObject
@property (nonatomic,copy)CBUUID *serviceUUID;+(id)shareUUIDSingle;
@end
.m文件
Static UUIDSingle * UUIDInstance = nil;
@implement UUIDSingle
+(id)shareUUIDSingle
{
   @synchronized(self){
      if(UUIDInstance ==nil){
         UUIDInstance = [[[self class] alloc] init];
      }
   }
   return UUIDInstance;
}
 
 
 
+(id)allocWithZone:(NSZone *)zone
{
   if(UUIDInstance == nil){
      UUIDInstance = [super allocWithZone:zone];
   }
   return UUIDInstance;
}
 
-(id)copyWithZone:(NSZone *)zone
{
   return UUIDInstance;
}
 
-(id)retain
{
    return UUIDInstance;
}
 
-(oneway void)release
{}
 
-(id)autorelease
{
    return UUIDInstance;
}
 
-(NSUInteger)retainCount
{
    return UINT_MAX;
}
@end

附录
1、@synchronized()
Objective-C 支持多线程,但是两个线程同时去改变同一个对象,就可能在程序中产生问题。为了避免一段代码在运行时被多个线程操作, Objective-C 提供了 @synchronized() 指令。@synchronized()指令会为一段代码加锁以在同一时间确保只有一个线程可以使用,其它的线程被锁定直到当前获得锁的线程退出受保护的代码。
@synchronized() 指令只有一个参数,可以是任何 Objective-C 对象。 这个对象被称为互斥信号量,使用不同的信号来保护程序的不同的临界区。最安全的方法就是在产生多线程的状况之前创建好所有需要的互斥信号对象,以防止出现紊乱状况。
使用@synchronized() 指令的优点就是不需要在代码中显式的创建锁对象,便可以实现锁的机制,但是@synchronized块会隐式的添加一个异常处理例程来保护代码,带来额外的开销,该处理例程会在异常抛出的时候自动的释放互斥锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值