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传参形式进行操作。

你可能感兴趣的:(Block原理)