Objective-C 单例模式写法以及单例模式模板宏

  1. Objective-C Singleton 单例模式解析,单例模式就是只有一个实例,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。  
  2. objective c 单例模式,objective c 设计模式,objective c singleton 。  
  3.   
  4. 单例指一个唯一的,由全局共享的对象,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。  
  5.   
  6. 官方建议  
  7.    
  8. 由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:  
  9. static MyGizmoClass *sharedGizmoManager = nil;  
  10. + (MyGizmoClass*)sharedManager  
  11. {  
  12.     @synchronized(self) {  
  13.         if (sharedGizmoManager == nil) {  
  14.             [[self alloc] init]; // assignment not done here  
  15.         }  
  16.     }  
  17.     return sharedGizmoManager;  
  18. }  
  19. + (id)allocWithZone:(NSZone *)zone  
  20. {  
  21.     @synchronized(self) {  
  22.         if (sharedGizmoManager == nil) {  
  23.             sharedGizmoManager = [super allocWithZone:zone];  
  24.             return sharedGizmoManager;  // assignment and return on first allocation  
  25.         }  
  26.     }  
  27.     return nil; //on subsequent allocation attempts return nil  
  28. }  
  29. - (id)copyWithZone:(NSZone *)zone  
  30. {  
  31.     return self;  
  32. }  
  33. - (id)retain  
  34. {  
  35.     return self;  
  36. }  
  37. - (unsigned)retainCount  
  38. {  
  39.     return UINT_MAX;  //denotes an object that cannot be released  
  40. }  
  41. - (void)release  
  42. {  
  43.     //do nothing  
  44. }  
  45. - (id)autorelease  
  46. {  
  47.     return self;  
  48. }  
  49.   
  50. 由于单例模式基本要符合上面的设计,当有很多类都要设计成单例模式时,可以定义  
  51. 一个单例模板的宏,以提高程序的重用和减少不必要错误。  
  52. #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \  
  53. \  
  54. static classname *shared##classname = nil; \  
  55. \  
  56. + (classname *)shared##classname \  
  57. { \  
  58. @synchronized(self) \  
  59. { \  
  60. if (shared##classname == nil) \  
  61. { \  
  62. shared##classname = [[self alloc] init]; \  
  63. } \  
  64. } \  
  65. \  
  66. return shared##classname; \  
  67. } \  
  68. \  
  69. + (id)allocWithZone:(NSZone *)zone \  
  70. { \  
  71. @synchronized(self) \  
  72. { \  
  73. if (shared##classname == nil) \  
  74. { \  
  75. shared##classname = [super allocWithZone:zone]; \  
  76. return shared##classname; \  
  77. } \  
  78. } \  
  79. \  
  80. returnnil; \  
  81. } \  
  82. \  
  83. - (id)copyWithZone:(NSZone *)zone \  
  84. { \  
  85. returnself; \  
  86. } \  
  87. \  
  88. - (id)retain \  
  89. { \  
  90. returnself; \  
  91. } \  
  92. \  
  93. - (NSUInteger)retainCount \  
  94. { \  
  95. return NSUIntegerMax; \  
  96. } \  
  97. \  
  98. - (void)release \  
  99. { \  
  100. } \  
  101. \  
  102. - (id)autorelease \  
  103. { \  
  104. returnself; \  
  105. }  

用法:假设AppPreference类要实现单例

#import "AppPreference.h"

#import "SingletonTemplate.h"


@implementation AppPreference


//使用宏模版生成单例所需要的code

SYNTHESIZE_SINGLETON_FOR_CLASS(AppPreference)


//这是一个测试方法

+ (void)test {

    //使用单例

    AppPreference *appPreference = [AppPreference sharedAppPreference];

}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值