iOS开发——Block详解

iOS开发——Block详解


1. Block是什么

  • 代码块
  • 匿名函数
  • 闭包——能够读取其他函数内部变量的函数
  • 函数变量
  • 实现基于指针和函数指针
  • 实现回调的机制

Block是一个非常有特色的语法,它可以把一个代码块作为一个变量来保存,也可以通过函数传递变量,然后让其他的对象来执行这一代码块。可以保存传递并在其他地方执行的代码块,这是我对Block的理解,也是我觉得Block最吸引我的地方。

2. 怎么写Block

官方写法

/**直接定义——返回Block指针
* ^返回类型<可省略>(参数类型 参数)<没有参数可省略>{
* 代码块;
* };
*/
^int(int a){
return a;
};
/**使用Block——返回Block返回值
* Block(参数)
*/
^int(int a){
return a;
}(5);
/**声明定义Block变量
* 返回类型 (^变量名)(参数类型);
*/
int (^example)(int);
example = ^(int a){
return a;
};

最建议写法

/**类型声明定义Block变量
* typedef 返回类型 (^Block名)(参数类型);
*/
typedef int (^Example)(int);
Example eg = ^(int a){
return a;
};
eg(5);

3. Block存在的坑

  • 默认Block只能访问局部变量的值,但是不能修改局部变量的值
  • 要修改局部变量的值需要在定义变量前面加上__block
  • 要修改局部对象的值需要在定义对象前面加上__weak
  • 全局变量的机制跟局部变量一样,默认传入时只会Copy源变量,对它修改不会起到任何作用,只有用__block或者__weak修饰的变量操作才有意义
  • 块是在栈上分布的,如果要保留块,就必须使用copy@property (nonamatic, copy) ABlock eg;
上一篇:iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)


下一篇:java 21 - 7 IO流小结的图解