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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiniuniu 中级黑马   /  2015-4-17 14:59  /  990 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

blcok封闭了一段代码, 可以在任何时候执行
block可以作为函数的参数,或函数的返回值, 而其本身又可以带参数和返回值
苹果官方建议多用block, 在多线程,异步任务,集合遍历,集合排序,动画转场用得很多
那block我们应该怎样去理解它呢



在这个代码中block的作用仅仅返回数值1, 断点, 反汇编代码, 查看
block变量就是一个含有函数指针类型变量的一个结构体, 前8字节是一个isa指针.  这个结构体是不透明的,所以其它变量的用途也不太清楚, 但很明显, 结构体中, 第4个成员变量
是根据我们block变量声明所生成的一个返回值为int无参的函数指针. 这个指针中存放的数值为函数的首地址 0x100000f30

再声明并定义一个有两个参数和一个返回值的块, 断点,反汇编代码,查看


同样block结构体中第4个成员变量又变成了 (int)(*)(int, int) 函数指针类型
所以我们可以简单理解, 块就是函数指针的变形使用
那么OC中为什么要引入块的概念,而不直接使用函数指针呢, 和直接使用函数指针比起来又什么不同呢, 以目前的知识积累可以得出结论三个字:  我Y的不知道! ^^
但至少我们可以肯定, 调用 一个块时就是在调用函数.



2 个回复

倒序浏览
请问下楼主右边紫色哪些是怎么弄出来的?
回复 使用道具 举报
block感觉就像是函数中的函数,相当于内联函数。
block可以作为函数参数使用,偶尔可以代替代理方法。另外它和函数指针的方式不同的是,它是在运行时产生,而函数指针所指向的函数在编译阶段就已经确定,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马