《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二

核心札记二   Blocks   阅读地点:北京 肯德基店  2014.4.7


1,Blocks 是C 语言的扩充功能,用一句话概述就是:带有自动变量(局部变量,作者将此翻译成自动变量)的匿名函数;


2,Blocks 类似C语言里面的函数指针,特别在C++里面它叫做Lambda,它与C函数唯一不同有两点:a)没有函数名,b)带有 ^(读caret),格式为 ^ 返回值类型 参数列表 表达式,如 ^ int (int count){ return count+1; } ,也可以省略返回值类型和参数列表,如^{ print} ;


3,对比函数指针和Blocks使用方法:

函数指针定义:int func (int count)( return count +1) ;  int (*funcptr)(int) = &func;

函数指针使用:int result = (*funcptr)(10);

Blocks定义:int (^blk)(int) = ^(int count){return count+1;};

Blocks使用:int result = blk(10);


4,通常定义一个block我们通常用typdef 来解决 ,如声明 typedef int ^(blk_t)(int); 定义个变量 blk_t blk_t_demo; 使用 int result =  blk_t_demo(10);


5,Blocks会截取自动变量,即局部变量的瞬间值,保存后不能修改,所以想修改局部变量可以在前面加入 __block 修饰符,block实质通过clang预测即为 OC对象;


6,Block 和 __block 变量都是在栈上的结构体,为了解决自动变量局部使用特性,Block 采用了从栈上复制到堆上来解决这个问题,即使局部失效释放了,堆上的可以继续使用,即[blk copy];


7 ,从栈复制到堆过程中,容易引起循环引用,建议变量前面增加__weak 修饰符来避免,尤其在MRC下__block说明符被用来避免Block中的循环引用,这是由于Block从栈复制到堆,若Block使用的变量为附有__Block 说明符的id类型或对象类型的自动变量,不会被retain,否则会被retain,即两种方式,如 id _weak temp = self; 和 __block id temp = self; 来达到防止循环引用。


总结:作者深入浅出的讲解了Block的前世今生,可谓挖尽骨髓来预测和证实这种匿名函数为什么被苹果工程师如此的推崇,这就是看中了它的简洁,高效率和易用性,同时也是对其他语言开发者的一种示好,关键要掌握好Block里面的内存释放问题,尤其是循环引用,在使用时候要特别注意。


趣闻:在读书期间,旁边出现了一个日本朋友问附近哪里有书店,正好这本书也是日本作者写的,不过这朋友的普通话的确不错,略聊几句,算是致敬作者了..


你可能感兴趣的:(《Objective-C 高级编程 iOS与OS X多线程和内存管理》 核心札记二)