- block是匿名函数
- 经典面试题
int val = 10; void (^blk)(void) = ^{ printf("val=%d\n",val);
};
val = 2;
blk();输出10,原因block在实现的时候就捕获外部变量,是copy一份,不改变原来的数值。
如果想要block内部想要改变外部的变量,就要用__block来修饰。
3.block循环引用问题
为什么使用类方法,不会循环引用,因为self 没有包含这个方法
如果非要block里面引用self,那么 _weak typedef weakself=self;
重要还是看有没有相互持有,注意:block里面对self的引用
4.block分类
根据Block在内存中的位置分为三种类型:
NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中。
NSStackBlock是位于栈区,超出变量作用域,栈上的Block以及 __block变量都被销毁。
NSMallocBlock是位于堆区,在变量作用域结束时不受影响。
注意:如果不想让block被释放的话,就copy一下吧