zoukankan      html  css  js  c++  java
  • Block的基本使用

    一、概述

    Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block(嵌套)。在实际开发中,Block是使用非常广泛的,可以说它与GCD是绝配。如果GCD没有了Block,也许一切都不一样了!

    二、声明和使用Block

    我们使用操作符来声明一个block变量和表明block的开始。Block体是由花括号{开始到花括号}结束。比如下面一个小例子:

    描述如下:

    image

    可能您也注意到了,block可以使用同一作用域范围的变量,比如上面的multiplier与myBlock变量是同一作用域的。

    如果我们声明block为变量,那么我们可以像函数调用一样来调用它:

     

    三、直接使用block

    在很多时候,我们并不需要声明block变量;相反,我们更多地是直接简单地写block内联体作为参数。下面我们通过qsort_b这个c函数来实现快速排序,它的最后一个参数是一个闭包,用于决定ASC还是DSC排序:

    四、Cocoa中的Block

    在Cocoa中有很多的方法是使用block作为参数的,最典型的就是集合对象的操作。比如,最常见的就是NSArray的排序API,需要指定一个排序规则,都是通过block来实现的。比如下面的排序:

    五、__block变量

    block可以在block体内修改有有效作用域范围的外部变量的值,它是block非常强大的特性。对于需要修改的外部变量,需要使用__block来标识。

    六、typedef block别名

    因为把block全写出来不太方便,而且在开发中使用block作为函数的参数时,直接将整个block写在参数位置,可读性明显降低,那么有什么办法可以解决这个问题呢?

    答案就是使用typedef给block起一个别名。

    下面是我的项目中经常使用的几个block别名:

    这么写有什么好处?语义清晰了,而且书写起来也简单多了。

    七、block作为参数返回值

    有时候,我们会直接返回一个block供外部调用,这时候就需要它了:

    八、block作为成员变量

    在开发中,我们见到很多block作为类的成员变量,用来代替代理的。比如,从控制器A进入到控制器B,在B操作完成后需要反馈给A,这时候使用block就很简化了!

    在A控制器中调起B控制器:

    在B中声明了一个block属性:

    然后在B操作完成时,回调A

  • 相关阅读:
    HDU 2563 统计问题 (DFS + 打表)
    KendoUi中KendoDropDownList控件的使用——三级级联模块的实现
    POJ 1325 && ZOJ 1364--Machine Schedule【二分图 && 最小点覆盖数】
    crontab FAQ
    思科2960trunk vlan配置及路由IP配置
    hdoj-1593-find a way to escape【数学题】
    Java编程思想(四) —— 复用类
    在 Android 应用程序中使用 SQLite 数据库以及怎么用
    Swift Standard Library Reference.pdf
    VC、IE、ASP环境下打印、预备的完美解决方式
  • 原文地址:https://www.cnblogs.com/jiayongqiang/p/5339568.html
Copyright © 2011-2022 走看看