定义:闭包(能够读取其他函数内部变量的函数)。闭包 = 一个函数【或者指向函数的指针】 + 该函数执行的外部的上下文变量【也就是自由变量】,其本质是一个特殊的OC对象。
block有三种类型
- 全局块(
_NSConcreteGlobalBlock
) ,全局块存在于全局内存中, 相当于单例。 - 栈块(
_NSConcreteStackBlock
),栈块存在于栈内存中, 超出其作用域则马上被销毁。 - 堆块(
_NSConcreteMallocBlock
),堆块存在于堆内存中, 是一个带引用计数的对象, 需要自行管理其内存。
block循环引用
解决办法
- ARC:使用
_weak
。
__weak typeof(self) weakSelf = self;
- MRC:使用
_block
。
__block typeof(self) weakSelf = self;
总结
- 在block使用的是将外部变量拷贝到堆中的(基本数据类型直接拷贝到堆上,对象类型将栈上的指针拷贝到堆中,并且指针所指向的地址是不变的)。
-
_block
修饰符的作用:将block内部用到的变量拷贝到堆中,并且外部变量的地址也改变到了堆中。 - _weak可以解决循环引用,block在捕获weakObj时,会对weakObj所指向的对象进行弱引用;但是其会导致外部对象在释放了之后,block内部也访问不到这个对象的问题,我们可以在block的内部声明一个_strong变量来指向weakObj,从而使得外部对象既能在block内部保持住,又能避免循环引用的问题。
- block的实现原理是C语言的函数指针,函数指针即函数内存中的地址,通过这个地址达到可以调用函数的目的。
简单的记录一下
网友评论