Block【OC】
- 答题顺序:
- block概念
- 是OC中特有的一种数据类型,用来保存一段代码的数据类型
- 声明block变量的语法为
- 为block变量赋值代码段语法为
- 返回值类型 (^block变量名称)(参数列表) = ^返回值类型 (参数列表) { 执行的代码 };
- ^为shift+6
- 分类
- 用法
- 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__)
|
|