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

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

时间: 2024-10-09 22:52:19

Effective Objective-C 2.0重读笔记---2的相关文章

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

上次看这本书的时候匆匆走了一遍,最近不太忙,重温了一遍,把笔记写出来~.. 有兴趣的可以去买一本,感觉这本书还是挺不错的 由于大部分是在坐车的时候用手机写的,所以代码很少,图也很少 1. 尽量使用向前声明,延后引入头文件的时间,这样可以减少编译时间2. 使用arraywithobjects:....如果遇到为空的变量,就会自动终止,后面的变量便会添加不上,切不会报错,会造成数据不一致问题,所以尽量使用字面量语法创建相关对象,减少出错且减少代码量3. 使用字面量创建的对象都是不可变的,如果要获得可

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记

编写高质量的iOS代码--Effective Objective-C 2.0 读书笔记 这本书年初刷完,感觉不错,介绍了很多小点,都是平日不怎么关注的. 第1章 熟悉Objective-C 这章没什么好介绍 第1条:了解Objective-C语言的起源 第2条:在类的头文件中尽量少引入其他头文件 第3条:多用字面量语法,少用与之等价的方法 第4条:多用类型常量,少用#define预处理指令 要理解为啥要少用#define预处理指令. 然后具体用哪个, 自己定吧 第5条:用枚举表示状态.选项.状态

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

sudo: effective uid is not 0, is sudo installed setuid root

当普通用户需要临时使用root权限的时候需要执行sudo命令,但是在执行sudo命令的时候需要使用root的权限去执行/usr/bin/sudo二进制文件. 如果报错出现sudo: effective uid is not 0, is sudo installed setuid root 证明/usr/bin/sudo文件没有设置s权限(用户在执行文件的时候,临时拥有文件所有者的权限.) 解决方法: chmod u+s /usr/bin/sudo 加上权限之后再查看文件 ll  /usr/bin

iOS开发——技术精华Swift篇&amp;Swift 2.0和Objective-C2.0混编之第三方框架的使用

Swift 2.0和Objective-C2.0混编之第三方框架的使用 swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引入了多种新功能,使得编程工作更加简便,灵活! 2015年6月9日苹果又一次给所有开发之者带来了一个惊喜,那就是今年年底swift讲开源,者队iOS开发着来说无疑是一个值得兴奋的消息,可是就在这短短的几个月里面swift吸引了越来

Swift 2.0学习笔记(Day5)——我所知道的标识符和关键字

Swift 2.0学习笔记(Day5)--我所知道的标识符和关键字   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和关键字,一直没有好好的总结,就是这样的用着,现在小小的整理一下Swift中的标识符和关键字. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发人员指定的名字. 其实,构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大小写,Myname与myname是两个不同的标识符: 标识符首字符可以以下划线(_)或者字

Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介

转自:http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介 Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同 Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度 Quartz.NET 2.0 学习笔记(4) :c

CentOS 6.5上安装GlassFish4.0 过程笔记

CentOS 6.5上安装GlassFish4.0 过程笔记 1.安装JDK, 注意操作系统的位数, 64 or 32: [[email protected] ~]# mkdir /usr/java  [[email protected] ~]# cd /usr/java[[email protected] java]#rpm -Uvh /bak/jdk-7u55-linux-x64.rpm  [[email protected] java]# JAVA_HOME=/usr/java/jdk1.