黑马程序员技术交流社区

标题: OC学习笔记20--OC中singleton的实现 [打印本页]

作者: wowthe1st    时间: 2015-8-15 00:03
标题: OC学习笔记20--OC中singleton的实现
实现步骤:
        1> 要实现singleton的类中提供一个类方法与外界分享
                        自己的唯一实例对象
        2> 该类的实现文件中,声明一个static(表示该全局变量作用域只能在当前文件中)
                        的该类全局变量,存放唯一实例
        3> 该类中重写那些关于产生新对象或销毁对象的方法,防止产生多个实例
                                和防止销毁唯一实例(单例对象一般在整个程序退出后才销毁)



  1. #import <Foundation/Foundation.h>


  2. @interface MySingleton :NSObject<NSCopying>
  3. {
  4.         @private
  5.         NSMutableDictionary * _dict;
  6. }
  7. // 对外部提供获取唯一实例的类方法
  8. +(id)shareMySingleton;
  9. -(NSMutableDictionary *)dict;
  10. @end
  11.    
  12.    
  13. int main(int argc, const char * argv[])  
  14. {        
  15.     NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
  16.    
  17.     MySingleton *s1=[MySingleton shareMySingleton];
  18.     [[s1 dict] setValue:@"value01" forKey:@"key01"];
  19.    
  20.     //单例对象无论怎么创建都是返回同一个唯一实例,也不会被销毁
  21.     MySingleton *s2=[[MySingleton shareMySingleton] autorelease];
  22.     MySingleton *s3=[[[MySingleton alloc] init] retain];
  23.     MySingleton *s4=[s3 copy];
  24.     [s4 release];

  25.     NSLog(@"\ns1=%@,s2=%@,s3=%@,s4=%@\n%lu,%lu",s1,s2,s3,s4,
  26.     [s4 retainCount],[[s4 dict] retainCount]);
  27.    
  28.     [pool drain];
  29.    
  30.      NSLog(@"\ns1=%@,s2=%@,s3=%@,s4=%@\n%lu,%lu",s1,s2,s3,s4,
  31.     [s4 retainCount],[[s4 dict] retainCount]);
  32.      
  33.      return 0;  
  34. }

  35. // 全局变量定义为static,限制在本文件中访问
  36. static MySingleton * _mySingleton = nil;

  37. @implementation MySingleton
  38. +(id)shareMySingleton
  39. {
  40.         // 使用线程锁保证线程安全
  41.         if(!_mySingleton)
  42.         {
  43.                 @synchronized(self)
  44.                 {
  45.                         if(!_mySingleton)
  46.                         {
  47.                                 _mySingleton=[[self alloc] init];
  48.                                 // 此处应该用alloc创建对象,防止被自动释放池释放
  49.                                 _mySingleton->_dict=[[NSMutableDictionary alloc] init];
  50.                         }
  51.                 }
  52.         }
  53.         return _mySingleton;
  54.        
  55. }

  56. -(NSString *)description
  57. {
  58.         return [NSString stringWithFormat:@"%@",_dict];
  59. }
  60. -(NSMutableDictionary *)dict
  61. {
  62.         return _dict;
  63. }



  64. // 重写类的创建方法,alloc方法中调用该方法
  65. +(id)allocWithZone:(NSZone *)zone
  66. {
  67.         if(!_mySingleton)
  68.         {
  69.                 @synchronized(self)
  70.                 {
  71.                         if(!_mySingleton)
  72.                         {
  73.                                 _mySingleton=[super allocWithZone:zone];
  74.                                
  75.                         }
  76.                 }
  77.         }
  78.         return _mySingleton;
  79.        
  80. }


  81. -(id)copyWithZone:(NSZone *)zone
  82. {
  83.         return self;
  84. }

  85. -(id)retain
  86. {
  87.         return self;
  88. }


  89. -(oneway void)release
  90. {
  91. }


  92. -(id)autorelease
  93. {
  94.         return self;
  95. }

  96. -(NSUInteger)retainCount
  97. {
  98.         return UINT_MAX;
  99. }


  100. @end
复制代码





作者: 默凉雨    时间: 2015-8-15 12:22
6666.。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2