iOS开发——Block详解

iOS开发——Block详解


1. Block是什么

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

Block是一个很是有特点的语法,它能够把一个代码块做为一个变量来保存,也能够经过函数传递变量,而后让其余的对象来执行这一代码块。能够保存传递并在其余地方执行的代码块,这是我对Block的理解,也是我以为Block最吸引个人地方。ios

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;
相关文章
相关标签/搜索