8.1.加锁-单例

2019-04-22  本文已影响0人  草根小强

加锁-单例

#import "ViewController.h"
#import "Single.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Single *single = [Single shareSingle];
    NSLog(@"%@",single);
    
    Single *obj = [[Single alloc]init];
    NSLog(@"%@",obj);
    
    Single *obj1 = [[Single alloc]init];
    NSLog(@"%@",obj1);
    
    Single *obj2 = [[Single alloc]init];
    NSLog(@"%@",obj2);
    
    Single *obj3 = [obj2 copy];
    NSLog(@"%@",obj3);
}


@end

#import <Foundation/Foundation.h>

@interface Single : NSObject<NSCopying>


//创建单例对象
+(instancetype)shareSingle;



@end

#import "Single.h"
#import <UIKit/UIKit.h>

@implementation Single

//全局的静态变量
static id obj;//默认是nil

+(instancetype)shareSingle{
    
//    static Single *obj = nil;
#if 0
    if (!obj) {
        
        obj = [[self alloc]init];
    }
#elif 0
    //加锁 同一时刻只允许一个线程访问
    @synchronized(self) {
        if (!obj) {
            
            obj = [[self alloc]init];
        }
    }
#elif 1
    //GCD加锁  dispatch_once_t只会执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        obj = [[self alloc]init];
    });

#endif

    return obj;
}

//重写这个方法 可以让我们用alloc创建的对象也是同一份对象
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        obj = [super allocWithZone:zone];
    });
    
    return obj;
}

//重写这个方法 copy的对象也是同一份对象
-(id)copyWithZone:(NSZone *)zone{
    
    return obj;
}




@end

加锁-单例.png
上一篇下一篇

猜你喜欢

热点阅读