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、程序代码区—存放函数体的二进制代码。
网友评论