GCD
火车追随者
这个作者很懒,什么都没留下…
展开
-
GCD介绍(一): 基本概念和Dispatch Queue
什么是GCD?Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。除了代码的平行执行能力,GCD还提供转载 2013-10-14 17:09:14 · 567 阅读 · 0 评论 -
Block介绍(一)基础
一、概述Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。 二、热身先看一个比较简单的Block例子:int multiplier = 7;int (^myBlock)(int) = ^(int num) { return nu转载 2013-10-14 17:43:17 · 542 阅读 · 0 评论 -
block介绍(三)揭开神秘面纱(上)
上一篇我们总结了各个情况下,block及其引用到的内存位置情况。接下来几篇,我们将剖析编译器转码以及运行时库源码来一探block的究竟。 block到底是什么我们使用clang的rewrite-objc命令来获取转码后的代码。 1、block的底层实现我们来看看最简单的一个block:图一 这个block仅仅打印栈变量i和j的值,其被clang转转载 2013-10-14 17:52:05 · 670 阅读 · 0 评论 -
GCD实战一:使用串行队列实现简单的预加载
其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入代码如下:@implementation DWAppDelegate{ dispatch_queue_t _serialQueue; UINavigationController *_navController;}转载 2013-10-14 17:15:59 · 505 阅读 · 0 评论 -
GCD介绍(三): Dispatch Sources
何为Dispatch Sources简单来说,dispatch source是一个监视某些类型事件的对象。当这些事件发生时,它自动将一个block放入一个dispatch queue的执行例程中。说的貌似有点不清不楚。我们到底讨论哪些事件类型?下面是GCD 10.6.0版本支持的事件:Mach port send right state changes.Mach port re转载 2013-10-14 17:13:00 · 502 阅读 · 0 评论 -
block介绍(四)揭开神秘面纱(下)
内存管理的真面目 objc层面如何区分不同内存区的blockBlock_private.h中有这样一组值:/* the raw data space for runtime classes for blocks *//* class+meta used for stack, malloc, and collectable based blocks */BLOCK_E转载 2013-10-15 08:42:54 · 779 阅读 · 0 评论 -
GCD实战2:资源竞争
概述我将分四步来带大家研究研究程序的并发计算。第一步是基本的串行程序,然后使用GCD把它并行计算化。如果你想顺着步骤来尝试这些程序的话,可以下载源码。注意,别运行imagegcd2.m,这是个反面教材。。 原始程序我们的程序只是简单地遍历~/Pictures然后生成缩略图。这个程序是个命令行程序,没有图形界面(尽管是使用Cocoa开发库的),主函数如下: in转载 2013-10-14 17:17:06 · 676 阅读 · 0 评论 -
GCD介绍(二): 多核心的性能
概念为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系)。在低层,GCD全局dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用,就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局队列进入相同的工作线程池(除非你的用户队列的目标是主线程,但是为了提高运行速度,我们绝不会这么干)。转载 2013-10-14 17:11:28 · 506 阅读 · 0 评论 -
GCD介绍(四): 完结
Dispatch Queue挂起dispatch queue可以被挂起和恢复。使用 dispatch_suspend函数来挂起,使用 dispatch_resume 函数来恢复。这两个函数的行为是如你所愿的。另外,这两个函数也可以用于dispatch source。一个要注意的地方是,dispatch queue的挂起是block粒度的。换句话说,挂起一个queue并不会将当前正在执行的转载 2013-10-14 17:13:57 · 714 阅读 · 0 评论 -
Block介绍(二)内存管理与其他特性
我们在前一章介绍了block的用法,而正确使用block必须要求正确理解block的内存管理问题。这一章,我们只陈述结果而不追寻原因,我们将在下一章深入其原因。一、block放在哪里我们针对不同情况来讨论block的存放位置:1.栈和堆以下情况中的block位于堆中:1234567891011121转载 2013-10-14 17:50:24 · 603 阅读 · 0 评论