• 关于block体的简单使用


    1:什么是 block 体,具体是什么形式,以及在什么时候使用?

       a)  Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,从ios4.0开始就很好的支持Block。 

       b)其形式如下:

    再次声明:block可以访问和block定义在同一个词法范围里的变量。 

    <span style=""><span class="kwd">{int</span><span class="pln"> multiplier </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> </span><span class="pun">(^</span><span class="pln">myBlock</span><span class="pun">)(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">^(</span><span class="kwd">int</span><span class="pln"> num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> num </span><span class="pun">*</span><span class="pln"> multipiler</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></span>
    <span style=""><span class="pln">printf</span><span class="pun">(</span><span class="str">"%d"</span><span class="pun">,</span><span class="pln"> myBlock</span><span class="pun">(</span><span class="lit">3</span><span class="pun">));</span><span class="pln"> </span><span class="com">// prints "21"</span></span>

    }  

    变量multiplier与定义的 myBlock在同一个词法范围内,因此可以访问,但不能修改。(block体只能修改全局变量,静态全局变量,静态局部变量,__block修饰的局部变量)

    c) Block除了能够定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__block变量)能够修改这些状态。此外,这些可修改的状态在相同词法范围内的多个block之间是共享的,即便出了该词法范围(比如栈展开,出了作用域),仍可以继续共享或者修改这些状态。通常来说,block都是一些简短代码片段的封装,适用作工作单元,通常用来做并发任务、遍历、以及回调。 

     

    2:block 的使用

    a:block不能修饰全局变量,只能修饰局部变量  __block是只针对局部变量生效的一种描述变量存储类型的关键字,因此__block类型的变量都是栈量; 

    b:修饰局部变量


    c:修饰实例变量

    3:使用实例

    a:局部变量在 black 体内不能被修改,但可以被访问



    可见全局变量i,静态全局变量 j,实例变量 k,__block 修饰的局部变量 l,静态局部变量 m均已经被修改,而局部变量n也能被正常访问。

    另两篇相关的文字链接  

    http://blog.csdn.net/menxu_work/article/details/8762848

    http://www.cnbluebox.com/?p=255

  • 相关阅读:
    javascript前端如何使用google-protobuf
    【Linux】Linux中常用操作命令
    MyEclipse 安装svn 插件步骤详情
    MultipartFile(文件的上传)--CommonsMultipartResolver
    oracle sql 获取本季度所有月份,上季度所有月份
    git与github安装、配置
    Java使用JaxWsDynamicClientFactory和HttpURLConnection两种方式调取webservice的接口
    三级联动
    Excel的两种导出入门方法(JAVA与JS)
    页面设置遮罩层
  • 原文地址:https://www.cnblogs.com/iOS-kk/p/5207547.html
Copyright © 2020-2023  润新知