A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© medley 中级黑马   /  2016-9-12 20:27  /  1369 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Block【OC】
  • 答题顺序:
    • 概念
    • 分类
    • 用法
    • block与函数的异同点
    • 注意点
  • block概念
    • 是OC中特有的一种数据类型,用来保存一段代码的数据类型
    • 声明block变量的语法为
      • 返回值(^变量名)(参数1,参数2);
    • 为block变量赋值代码段语法为
      • 返回值类型 (^block变量名称)(参数列表) = ^返回值类型 (参数列表) { 执行的代码 };
      • ^为shift+6
  • 分类
    • 目前来讲,一共有4种
      • 无参无返回值
      • 有参无返回值
      • 无参有返回值
      • 有参有返回值
  • 用法
    • block可以作为函数的参数
    • block可以作为方法的参数
  • block与函数的异同点
    • 相同点
      • 都可以封装一段代码
    • 不同点
      • block是一个数据类型
      • 可以声明变量
      • 也可以作为函数或方法的参数
      • 也可以做为函数和方法的返回值
      • 但函数做不到上边的三点
  • 注意点 //注意点比较多,酌情记
    • 如果一个代码段没有参数,是可以省略掉参数列表的小括号
    • 代码的返回值类型可以直接省略,因为编译器可以自动检测返回值类型
    • 参数列表里可以不写参数的名称,只写参数的类型和数量,但我们平常是使用block时,最好使用完整的格式书写
    • typedef可以简化声明block的声明语法
      • 具体为 typedef 返回值类型(^变量名)(参数1,参数2.....);
      • 这时就可以使用变量名来声明block变量
      • 但在实际开发中很少使用typedef
    • block代码块的内部可以直接访问并修改全局变量,但只能访问局部变量,若想修改局部变量,需要在变量前加上__block进行修饰
    • block访问全局变量时比较简单,变量的地址不变,block内部可以直接修改这个全局变量的值
    • block访问局部变量规则相对比较复杂
      • 因外部的局部变量存储在栈区,在block代码内部访问这些变量时会把该变量拷贝到堆区,以常量的形式进行存在,所以此时,常量的值是无法修改的,也就是block无法直接修改局部变量的值
      • 若是在外部的局部变量被__block修饰,那么此时在block代码块内部访问此变量时,同样是拷贝到堆区,但此时是以指针的形式进行拷贝,所以,此时可以修改局部变量的值
    • 如果在block内部定义了一个和外部变量相同的局部变量,那么在block内部屏蔽对外部变量的访问
    • block内部创建的变量,如果是C的基本数据类型是存储在栈区,如果是OC对象,那么是存储在堆区,这点和在外部的变量存储方式
    • MRC模式下
      • 如果在block内部没有访问外部的局部变量,那么block是存储在全局区
      • 如果访问了,那么会存储到栈区
    • ARC下
      • 如果内部没有访问外部的局部变量,那么block也是存储在全局区(__NSGlobalBlock__)
      • 如果访问了,那么会存储到堆区(__NSMallocBlock__)

评分

参与人数 1黑马币 +20 收起 理由
微雨独行 + 20 总结的不错,好好加油

查看全部评分

2 个回复

倒序浏览
拿走了 谢谢
回复 使用道具 举报
感谢分享,赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马