0423 - GCD( Grand Central Dispatch)

block复习

请问,图中输出结果是多少?为什么?

答:结果是10.因为在定义block的时候,block会把它前面的要用到的变量做一个内存拷贝,然后block执行的时候就从内存拷贝中去取值来使用.就像下面这样:


GCD的队列和任务


使用[NSThread currentThread] 可以在开发中跟踪当前线程
GCD创建异步串行队列


GCD创建异步并行队列


GCD创建全局队列

注意:DISPATCH_QUEUE_PRIORITY_DEFAULT这个是队列线程优先级,不要改用默认的.否则可能会产生优先级的反转,即低优先级的线程会阻塞高优先级的线程


GCD创建主线程队列


GCD的同步任务都在在哪个线程执行要看此方法是在主线程中调还是在子线程中调,在哪调就再哪个线程上,在开发中极少用.但面试可能会问

注意:在非ARC开发中,即在MRC开发中,一定不要忘记GCD的release.如下图所示:


注意:在主线程队列中直接执行同步任务会死锁


NSOperation & NSOperationQueue


NSBlockOperation的创建


NSInvocationOperation的创建


NSBlockOperation线程间的相互依赖达到线程串行队列执行

线程串行执行有两个方法可以达到:

1、使用GCD的串行队列

2、使用NSBlockOperation线程间的相互依赖addDependency

注意:上面两个方法的区别是1中只开启一个子线程去串行执行,而2中可能会开启多个具体几个不确定但不会开太多

NSBlockOperation线程相互依赖代码如下图所示:

当然也可以设定NSOperation同时并发的数目.当设定为1的时候只会有一个.当大于1个的时候开启的线程数目是在设定值的周围浮动.如下图所示:


单例的实现

代码如下:

网上也有另一种写法,但存在问题,如下图:

再如:


NDObject多线程方法

例子:

注意:这里的waitUntilDone类似C#中的task.WaitOne(),阻塞主线程.

NSThread的坏处


下面的代码很巧妙

注意:方法内部的临时变量都是存在栈中,oc对象都是存在堆中.栈的大小只有1M,当栈撑满之后 就不行了,栈溢出.因为要把大量变量的创建放在一个autoreleasepool自动释放池中,防止栈溢出.代码如下:


iOS 进阶 第十八天(0423)的更多相关文章

  1. iOS进阶_地图上定位的标志——大头针

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...

  2. iOS进阶指南试读之UI篇

    iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...

  3. iOS 进阶 第十九天(0423)

    0427 深复制/浅复制 浅复制:是址引用 深复制:是值拷贝 下面是解释,如下图: 运行时机制runtime 1.表象的就是MPMoviePlayer 2.深层的是 clang -rewrite-ob ...

  4. iOS进阶读物

    不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...

  5. iOS进阶推荐的书目

    <Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法>([英]Matt Galloway) 很多面试题有涉及 <IOS数据库应用高级编 ...

  6. iOS进阶路线以及进阶书籍

    第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...

  7. iOS进阶之多线程

    多线程 注意:iOS关于UI的刷新和添加必须在主线程中操作! pthread的创建方法: pthread_t pthread; //第一个参数 线程指针 //第二个参数 线程的一些属性 //第三个参数 ...

  8. iOS进阶_三方使用步骤

    一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...

  9. iOS进阶面试题----Block部分

    1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...

随机推荐

  1. Oracle笔记 九、PL/SQL 游标的使用

    --演示隐式游标,系统自动声明,自动打开,自动使用并且自动关闭 begin update emp set sal = 1000; dbms_output.put_line('影响的行数:' || sq ...

  2. 005windows与Linux文件共享

    基于网络的文件共享: 前提一:从windows能够ping通Linux: 前提二:关闭Linux防火墙,命令[/etc/init.d/iptables stop]: 方法一:通过WinSCP 步骤一: ...

  3. php通过正则从字符串中获取所有图片url地址

    /** * 提取字符串中图片url地址 * @param type $str * @return type */ function getimgs($str) { $reg = '/((http|ht ...

  4. sqlite:多线程操作数据库“database is locked”解决方法(二)

    上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...

  5. Mysql的ssl主从复制+半同步主从复制

    Mysql的ssl主从复制+半同步主从复制 准备工作 1.主从服务器时间同步 [root@localhost ~]# crontab -e */30 * * * * /usr/sbin/ntpdate ...

  6. Zend Studio下调试PHP的一点注意事项

    Zend Studio默认php文件的存放路径是你配置的服务器的路径,比如你配置的服务器是localhost,那么,你在zend下建立的文件均是相对于localhost而言的,比如你新建一个php工程 ...

  7. 【推介】GitHub

    隆重推介:GitHub(https://github.com/) 作为开源代码库以及版本控制系统,Github拥有140多万开发者用户. 随着越来越多的应用程序转移到了云上,Github已经成为了管理 ...

  8. Treeview获取父节点

    private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object&g ...

  9. 十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

    1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖   ...

  10. salt-ssh安装及简单使用

    需要 salt-master 0.17以上版本支持 1.安装 相关依赖包可查看requirements.txt Jinja2 M2Crypto msgpack-python pycrypto PyYA ...