码迷,mamicode.com
首页 > 其他好文 > 详细

Effective Objective-C 2.0重读笔记---2

时间:2014-08-05 18:47:10      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   数据   for   ar   

1. 很多时候我们需要保证读写数据的安全性,这时候最好不要使用@synchronized同步块,因为同步块中的代码必须单独执行,这有可能会使当前的代码等许多无关的代码执行完毕才能继续执行,降低程序运行效率。此外还有NSLock ,NSRecursiveLock这些锁,但是这些锁也应该少用,

最好的办法就是用GCD队列保证数据的安全性,而且GCD基于XUN内核,提供了很多底层优化

dispatch_queue_t serialQ = dispatch_queue_create("testGCDQueue",DISPATCH_QUEUE_SERIAL);
        dispatch_barrier_async(serialQ, ^{
            // safe
        });
dispatch_queue_t serialQ = dispatch_queue_create("testGCDQueue",DISPATCH_QUEUE_SERIAL);
        dispatch_barrier_sync(serialQ, ^{
            // safe
        });

如果块中的代码量比较少,你会发现asyn居然比syn慢,这是因为asyn需要拷贝块,但是当块里面逻辑运算负责的时候据要看具体情况了

保证数据安全一般是在set和get方法里,所以一般而且数据是允许多读单写的

如果使用并发队列,可以再set里面使用syn在get里面使用asyn,但是读写有可能会交叉进行,所以这样不是很安全

GCD里面提供了一种栅栏块,这种块会等之前的任务块全部执行完毕以后再执行,而栅栏块之后的块需要等到栅栏块执行完毕之后才执行,这样便能提高安全性还能并发执行

 dispatch_barrier_async(cerialQ, ^{
            // safe
        });

 

2.performSelector系列方法在内存管理方面有所疏漏,他无法确定将要执行的选择自具体是什么,因而ARC编译器也就无法插入适当的内存管理方法

而且Per还有很大局限性,per所能实现的功能GCD或者operation都能实现

 

3.dipatch_group机制可以将队列分组,调用者可以获悉这组任务何时执行完毕

dispatch_group_t group = dispatch_group_create();
long b = dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"111111Hello, World!%ld",b);
         // NSLog(@"Hello, World!%ld",a);
        dispatch_sync(queue1, ^{
            for (int i = 0 ; i< 10000 ;i++) {
                NSLog(@"cccccccc");
            }
            NSLog(@"ququeee1");
        });
        NSLog(@"3333333Hello, World!%ld",b);

上面的代码是创建一个dispatch_group,等待queue1执行,DISPATCH_TIME_FOREVER是永远等待执行,如果是永远等待,wait函数会返回0.,如果不是DISPATCH_TIME_FOREVER,而是一个数,如果这个数小于执行的执行时间则返回非0.否则返回0

 

Effective Objective-C 2.0重读笔记---2,布布扣,bubuko.com

Effective Objective-C 2.0重读笔记---2

标签:style   blog   color   使用   io   数据   for   ar   

原文地址:http://www.cnblogs.com/xyzaijing/p/3892513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!