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