iOS学习笔记1-多线程GCD与block

本文是关于iOS开发中GCD(Grand Central Dispatch)和Block的基础知识总结。介绍了GCD的基本概念,如队列、任务、同步和异步执行,并通过示例代码解释了如何使用GCD创建并发和串行队列。同时,文章还涵盖了Block的定义和使用,包括其内存管理特性。

学习IOS也有两三个月了,今天来总结下学习GCD的知识点,希望大家多多指教:

1.GCD简介以及block

GCD:Grand Central Dispatch或者GCD,是一套low level API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。使用GCD比使用NSOpertionQueue方便;
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样,但苹果把它叫做blocks。
block:块是C语言的一种扩展。先给个典型的代码:

^(void){
    NSLog(@"Program is funning\n");
};

由上例,典型的block指的是以插入“^”为开头为标识的代码块,^后面跟的(void)表示块所需要的参数列表;
当然,我们可以定义一个变量来表示这个block,就像是函数指针的感觉(有两种方法):
(1)方法1:如下例:

void (^printMessage) (void)=
^(void){
    NSLog(@"Program is funning\n");
};

等号左边表示的是printMessage指向一个没有参数和返回值的块指针,第一个void是返回值(和C语言函数语法一致),第二个void指的是传入的参数(类比于函数的形参);
执行一个变量引用的块,与函数调用方法一致:
printMessage();
(2)方法2:如下例:(更加常用的方法)

dispatch_block_t block = ^{
                //do something
                        };

调用方法一致:

block();
关于block变量:

(1)对于局部自动变量:在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。

int base = 100;
BlkSum sum = ^ long (int a, int b) {
  // base++; 编译错误,只读
  return base + a + b;
};
base = 0;
printf("%ld\n",sum(1,2)); // 这里输出是103,而不是3

注意:,可以从上面看到,这是block只会从定义该block之前取值,对于base=0这条语句是忽略的;
(2)static变量、全局变量。如果把上个例子的base改成全局的、或static。Block就可以对他进行读写了。因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量。

static int base = 100;
BlkSum sum = ^ long (int a, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值