block

作者: 雷3雷 | 来源:发表于2018-09-13 18:49 被阅读14次

1.什么是block:获取其他函数变量的匿名函数,也可以说block也会是一个oc对象,因为它的结构体__block_impl也有isa指针。

2.__block在arc、mrc下的区别:mrc下不会retain,在arc下会retain。

3.bloak要改变外部变量的值怎么做?

不用__block修饰只拷贝了变量的值,使用__block修饰获取变量的isa指针。

block的几种适用场合:

任务完成时回调处理

消息监听回调处理

错误回调处理

枚举回调

视图动画、变换

(1)代理的修饰词用weak关键字,为什么不能用strong呢?

答:因为,代理方会强行持有代理属性,而此时代理属性用strong的话,会造成循环引用。用weak解循环

(2)那代理为什么不用assgin关键字呢?

答:因为weak修饰的对象,在释放的时候会被置为nil,而oc向nil发送消息是没问题的,但是用assign就会造成野指针的错误unrecongnized selected send to instance.

(3)为什么Block用copy 关键字?

答:Block在没有使用外部变量时,内存存在全局区,然而,当Block在使用外部变量的时候,内存是存在于栈区,当Block copy之后,是存在堆区的。知道了这些之后,就不难解释为什么Block要用copy修饰,因为存在于栈区的特点是对象随时有可能被销毁,一旦销毁在调用的时候,就会造成系统的崩溃。所以Block要用copy关键字。

4.代理和Block的效率对比。

通过两者关键字的比较,Block的效率会低于代理,因为Block要做栈堆的拷贝。

5.两者对事件的处理对比。

代理更加注重事件的过程,而Block更注重事件处理的结果。

6.使用两者的情形。

在多消息传递的时候,使用代理更清晰,而Block显得不直观也不易维护。

如果委托方向调用多个代理对象的时候,使用Block。因为一个委托对象的代理属性只有一个(weak修饰)。代理修改的是代理本身。

大多数情况下编译器会进行判断,自动生成将Block从栈上复制到堆上的代码,以下几种情况栈上的Block会自动复制到堆上:

调用Block的copy方法

将Block作为函数返回值时

将Block赋值给__strong修改的变量时

向Cocoa框架含有usingBlock的方法或者GCD的API传递Block参数

1、栈区(stack)—  由编译器自动分配释放  ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

  2、堆区(heap)  —  一般由程序员分配释放,  若程序员不释放,程序结束时可能由OS回收  。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 

  3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,  未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。  -  程序结束后由系统释放。 

  4、文字常量区  —常量字符串就是放在这里的。  程序结束后由系统释放 

  5、程序代码区—存放函数体的二进制代码。 

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:block

      本文链接:https://www.haomeiwen.com/subject/xrmgdftx.html