黑马程序员技术交流社区
标题:
block综合
[打印本页]
作者:
medley
时间:
2016-9-12 20:27
标题:
block综合
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__)
作者:
151678537
时间:
2016-9-12 22:01
拿走了 谢谢
作者:
iamsongxuanlike
时间:
2016-9-13 18:16
感谢分享,赞一个
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2