ios-GCD中的其他操作和创建单例对象的对比

来源:互联网 发布:塞班看图软件 编辑:程序博客网 时间:2024/06/05 10:37

在主线程中延迟执行,如果我们想要在子线程中执行,可以将dispatch_get_main_queue改成 dispatch_get_global_queue(0, 0);

  //延迟执行    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{            });

一次性执行在当前线程上执行,一次性执行的原理是判断静态的全局变量的值,默认是0,如果执行完成之后,设置为-1。once内部会判断变量的值,如果是0就会去执行

 dispatch_async(dispatch_get_global_queue(0, 0), ^{        static dispatch_once_t onceToken;        dispatch_once(&onceToken,^{            NSLog(@"%@",[NSThread currentThread]);        });    });

我们用once的方法去设置创建单例对象的方法和用同步锁去设置创建单例对象的方法是用once的方法比较快。

+(instancetype)sharedNetwork{    //定义instance只执行一次    static id instance=nil;       //防止频繁加锁        if(instance == nil)  { //线程同步,保证线程的安全  @synchronized (self) { if(instance==nil){instance =[[self alloc]init];} } } return instance;}
还有种方法就是为了防止外部在使用的时候调用了alloc,init的时候又创建了对象,所以我们需要去重写alloc方法,而alloc方法的底层实现是+(instancetype)allocWithZone:(struct _NSZone *)zone,这个方法,所以我们重写下这个方法就可以了,再写个sharedTool方法进行封装。

static id instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{         if(instance ==nil)//防止频繁加锁     {    @synchronized (self) {        if(instance==nil)//防止多线程进入到了这里,如果这里不判断为nil,还是会创建多个        {            instance=[super allocWithZone:zone];        }    }   }   return tool;}+(instancetype)sharedNetworkTool{    return [[self alloc]init];}
为了防止我们调用sharedTool方法init多次,所以我们就可以把shared方法改成上面我们写的那两个单例创建对象的方式,防止copy出来新对象,我们也可以重写下copyWithZone这个方法。我们创建的对象是NSObject的对象

- (id)copyWithZone:(NSZone *)zone{    return _instance;}