zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    New Skateboard
    1127
    一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    vim 快捷键绑定
    使用git 上传项目到gitee/github
    Linux进程/线程调度策略与 进程优先级
    【框架】共享内存组设计思路与实现(更新中)
    linux下六大IPC机制【转】
    详解Linux内核红黑树算法的实现
    Linux 内核里的数据结构:红黑树(rb-tree)
  • 原文地址:https://www.cnblogs.com/wisejoker/p/3957507.html
Copyright © 2011-2022 走看看