Block原理

block是一个对象,可以捕获外部变量,是一个匿名函数,可以保存代码块。使用copy进行修饰,因为一开始处于静态区,当调用外部变量的时候,处于栈区,因为栈区的内容随时可能被销毁,通过copy进入堆区进行操作。block需要调用才能执行,因为funcptr保存当前代码块中的函数,需要通过funcptr方法调用,才能进行操作。因此block需要调用才能响应。

block根据内存分为3类:

  1. NSGlobalBlock,在全局静态区。
  2. NSMallocBlock :处于堆区,有外部变量引入。
  3. NSStackBlock:处于栈区。

Block在使用中对于循环引用问题的解决方案:

  • weak,strong操作
  • 在外部定义一个三方变量a(self->block->a->self)用__block修饰,在block内调用完毕后,将a=nil,以次来打破循环。
    __block修饰的变量,捕获到自己属性里,即声明定义一个临时变量,对应的是一个结构体,此结构体存放的是原有变量的值和地址,调用执行后,输出的其实是这个临时变量指针对应的内容。值会随着原有变量的变化而变化。
  • 通过block传参形式进行操作。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。