美文网首页
OC中调用block之前先判空

OC中调用block之前先判空

作者: 梁森的简书 | 来源:发表于2021-05-29 17:15 被阅读0次

OC中的block也是一种对象,它的本质是结构体。
我们在调用block的时候应该判空,如果block为空,我们还去调用就会直接crash掉。
这里block为空不是nil,而是null。


0.null.jpg

调用block走的不是OC中调用方法的消息机制,(swift中函数派发机制)block的地址在编译期已经确定了调用的地址。
当block为空的时候,CPU会去访问地址address=0x10,这样就会报EXC_BAD_ACCESS错误。

0.bad_access.jpg

别人更深入的解释(https://blog.csdn.net/blog_jihq/article/details/79189919
address=0x10问题的原因在是block的结构体寻址问题
看block结构

//__block_imp:  这个是编译器给我们生成的结构体,每一个block都会用到这个结构体
struct __block_impl {
  void *isa;         //类型
  int Flags;          //标识字段
  int Reserved;       //保留字段       
  void *FuncPtr;       //函数指针,这个会指向编译器给我们生成的下面的静态函数__main_block_func_0
};

0x10是十六进制,也就是struct基地址后的第16个字节,其中void *类型占8个字节,int类型占4个字节,所以0x10的地址就是FuncPtr的地址,而address=0x10的问题也正是对值为nil的block强行调用导致的

相关文章

网友评论

      本文标题:OC中调用block之前先判空

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