一般我们看到的ios单列中并未有加@synchronized(self),然而这样如果是多个线程同时来调用该单列,就会出现问题,创建的实例就不只是单列了,加了线程锁后让该单列始终只能返回一个实例,即单例:假如线程A来调用shareUserContext,这句话时候,会判断 segtonInstance == nil的情况,若没有创建则会创建实例,然而另外的一个线程B也来调用这句话时候,没有线程锁的情况会使其并发调用,即创建了两个实例;有了线程锁,让A创建好了实例后,那么B再来调用的时候就不会走进入if(segtonInstance == nil){}的括号,而直接执行 retrun segtonInstance这句,避免了重复创建实例。我认为线程锁的作用在于避免并发调用该方法,避免创建大于1个实例。
- #import <Foundation/Foundation.h>
- @interface UserContext : NSObject
- {
- }
- //创建单例的属性
- @property(nonatomic,copy) NSString *userName;
- @property(nonatomic,copy) NSString *userInfo;
- //创建单例方法
- +(id)shareUser;
- @end
- #import "UserContext.h"
- static UserContext *singInstance = nil;
- @implementation UserContext
- @synthesize userName;
- @synthesize userInfo;
- + (id)shareUser{
- @synchronized(self){
- if (singInstance == nil) {
- singInstance = [[[self class] alloc] init];
- }
- }
- return singInstance;
- }
- + (id)allocWithZone:(NSZone *)zone{
- if (singInstance == nil) {
- singInstance = [super allocWithZone:zone];
- }
- return singInstance;
- }
- - (id)copyWithZone:(NSZone *)zone{
- return singInstance;
- }
- - (id)retain{
- return singInstance;
- }
- - (oneway void)release{
- }
- - (id)autorelease{
- return singInstance;
- }
- @end
粗略的写了个demo,一个viewcontroller设置单例的属性,另外一个viewController访问单例的属性;单例的其他用法可以度娘或者骨骼下。
http://pan.baidu.com/share/link?shareid=171718&uk=2315407450