ios中单例的使用方法以及加线程锁

                  一般我们看到的ios单列中并未有加@synchronized(self),然而这样如果是多个线程同时来调用该单列,就会出现问题,创建的实例就不只是单列了,加了线程锁后让该单列始终只能返回一个实例,即单例:假如线程A来调用shareUserContext,这句话时候,会判断 segtonInstance == nil的情况,若没有创建则会创建实例,然而另外的一个线程B也来调用这句话时候,没有线程锁的情况会使其并发调用,即创建了两个实例;有了线程锁,让A创建好了实例后,那么B再来调用的时候就不会走进入if(segtonInstance == nil){}的括号,而直接执行 retrun segtonInstance这句,避免了重复创建实例。我认为线程锁的作用在于避免并发调用该方法,避免创建大于1个实例。

[plain]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface UserContext : NSObject  
  4. {  
  5.       
  6. }  
  7. //创建单例的属性  
  8.   
  9. @property(nonatomic,copy) NSString *userName;  
  10. @property(nonatomic,copy) NSString *userInfo;  
  11.   
  12. //创建单例方法  
  13.   
  14. +(id)shareUser;  
  15.   
  16. @end  

[plain]  view plain copy
  1. #import "UserContext.h"  
  2. static UserContext *singInstance = nil;  
  3.   
  4. @implementation UserContext  
  5. @synthesize userName;  
  6. @synthesize userInfo;  
  7.   
  8. + (id)shareUser{  
  9.       
  10.     @synchronized(self){  
  11.         if (singInstance == nil) {  
  12.               
  13.             singInstance = [[[self class] alloc] init];  
  14.         }  
  15.     }  
  16.               
  17.     return singInstance;  
  18. }  
  19.   
  20. + (id)allocWithZone:(NSZone *)zone{  
  21.     if (singInstance == nil) {  
  22.           
  23.         singInstance = [super allocWithZone:zone];  
  24.           
  25.     }  
  26.     return singInstance;  
  27. }  
  28.   
  29. - (id)copyWithZone:(NSZone *)zone{  
  30.     return singInstance;  
  31. }  
  32.   
  33. - (id)retain{  
  34.     return singInstance;  
  35. }  
  36.   
  37. - (oneway void)release{  
  38.       
  39. }  
  40. - (id)autorelease{  
  41.     return singInstance;  
  42. }  
  43.   
  44. @end  

粗略的写了个demo,一个viewcontroller设置单例的属性,另外一个viewController访问单例的属性;单例的其他用法可以度娘或者骨骼下。

http://pan.baidu.com/share/link?shareid=171718&uk=2315407450

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值