GCD和Block

gcd使用block注意事项:
1、block 在实现时就会对它引用到的它所在方法中定义的栈变量进行一次只读拷贝,然后在 block 块内使用该只读拷贝;
2、非内联(inline) block 不能直接访问 self,只能通过将 self 当作参数传递到 block 中才能使用,并且此时的 self 只能通过 setter 或 getter 方法访问其属性,不能使用句点式方法。但内联 block 不受此限制;
3、使用 weak–strong dance 技术来避免循环引用;
4、block 内存管理分析:

block 其实也是一个 NSObject 对象,并且在大多数情况下,block 是分配在栈上面的,只有当 block 被定义为全局变量或 block 块中没有引用任何 automatic 变量时,block 才分配在全局数据段上。 __block 变量也是分配在栈上面的。


GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式。 在Mac OS X 10.6和IOS 4.0之后开始支持GCD

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。

GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识。

在开始之前,需要理解是要提供给GCD队列的是代码块(block),用于在系统或者用户创建的的队列上调度运行。

block可以看作一个增强型的函数指针,可为变量赋值,也可以作为参数传递给函数或方法,当然也可以执行。

 

       GCD相对来说是一种更优雅的方式,看如下代码:

          NSString* parameter = [self getSomeParameter];

         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

          NSString* result = [self fetchResultFromWebWithParameter:parameter]; 

         dispatch_async(dispatch_get_main_queue(), 

         ^{ [self updateUIWithResult:result];

         });

         代码中,出现了一种奇怪的格式:^{code...}

           解释一下,当一段代码被花括号包裹并在开头放置上尖号时,我们称之为块(block)。如果你学过C语言的话(实际上,block正是apple对C的一个扩 展), 你可以认为这是一个增强型的函数指针。它不仅可以当做一个变量来回传递,还可以引用本身环境之外的变量(如上面代码中的parameter)。 更进一步地说,它是apple的C扩展中闭包的实现。在block里引用的对象会自动被retain,因此你也不必担心内存的问题。

         另外涉及到了三个函数

        void dispatch_async( dispatch_queue_t queue, dispatch_block_t block);

        dispatch_queue_t dispatch_get_global_queue( long priority, unsigned long flags);

         dispatch_get_main_queue();

         dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 


           dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留    字段备用(一般为0)。 

            dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面(比如上面代码中的[self updateUIWithResult:result])的情况。

            好的,知道这些特性之后,我们可以这样理解上面的代码:利用parameter变量异步地发起一个网络请求,并在请求之后更新UI线程

                   BLOCK

1. ^( 传人参数列) {函数体;};

举个例子int result = ^(int a) {return a*a;} (5); 表示返回传人参数的平方值。

2.返回值 ^(函数指针名) (传人参数列);

 int (^sillyBlock)(int);      sillyBlock= ^(int a) {return a*a;}  ; int result = sillyBlock(5);

3.作为函数参数传人

    int (^mySqaure) (int) = ^(int a) {return a*a;}; //定义一个有函数实体的block pointer

myFunction( mySqaure ) ; //作为参数传人

4.OC方法传人值的话需要把类型写在函数指针前面,然后加小括号

   -(void) objcMethod:( int (^) (int) ) square; // square 参数的类型是 int (^) (int)

关于block详细内容可参考以下连接

iOS开发之-Block

详解Objective-c Block应用

   Apple的官方block编程指南 

         Apple官方GCD指南


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值