单例类的实现方法(转载)

如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。
单态模式在Java、C++中很常用,在Cocoa里,也可以实现。
但是,
Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。

官方建议

由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:
  1. static MyGizmoClass *sharedGizmoManager = nil;
  2. + (MyGizmoClass*)sharedManager
  3. {
  4.     @synchronized(self) {
  5.         if (sharedGizmoManager == nil) {
  6.             [[self alloc] init]; // assignment not done here
  7.         }
  8.     }
  9.     return sharedGizmoManager;
  10. }
  11. + (id)allocWithZone:(NSZone *)zone
  12. {
  13.     @synchronized(self) {
  14.         if (sharedGizmoManager == nil) {
  15.             sharedGizmoManager = [super allocWithZone:zone];
  16.             return sharedGizmoManager;  // assignment and return on first allocation
  17.         }
  18.     }
  19.     return nil; //on subsequent allocation attempts return nil
  20. }
  21. - (id)copyWithZone:(NSZone *)zone
  22. {
  23.     return self;
  24. }
  25. - (id)retain
  26. {
  27.     return self;
  28. }
  29. - (unsigned)retainCount
  30. {
  31.     return UINT_MAX;  //denotes an object that cannot be released
  32. }
  33. - (void)release
  34. {
  35.     //do nothing
  36. }
  37. - (id)autorelease
  38. {
  39.     return self;
  40. }
复制代码
程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。
单例包含以下接口
  1. + (MyClass*) sharedInstance;
  2. + (void) purgeSharedInstance;
复制代码
调用sharedInstance会创建并返回单例
调用purgeSharedInstance会销毁单例
手动调用alloc也可以保证是单例,你可以这样调用
  1. [[MyClass alloc] initWithParam:firstParam secondParam:secondParam];
复制代码
只是要保证在sharedInstance之前调用,因为只有一次创建机会。
下面是使用宏的写法“
MyClass.h:
========================================
  1.     #import "SynthesizeSingleton.h"
  2.     @interface MyClass: SomeSuperclass
  3.     {
  4.         ...
  5.     }
  6.     SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);
  7.     @end
复制代码
========================================

    MyClass.m:
========================================
  1.     #import "MyClass.h"
  2.     @implementation MyClass
  3.     SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);
  4.     ...
  5.     @end
复制代码
========================================、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值