block本质是两个结构体,使用block使代码简单易读。
使用Block注意:
1、block内部使用外部指针,会造成循环引用问题,可以用__weak修饰外部指针。
2、block内部修改外部变量,需要用__block修饰外部变量。
3、block内部调用了延时函数,并且使用了弱指针,此时会找不到该指针,因为他已经被销毁,需要再block内部将弱指针重新引用。
block在arc和非arc下的区别:
一般在block内部修改外部变量需要用__block修饰。
在arc中,blcok修饰的变量的引用计数+1,非arc中应用计数不变。
在arc中解决循环应用用__weak修改,在mrc中用__block修饰。
block内部修改外部变量的原理?
写操作不对原变量生效,加上__block修饰让写操作生效,之所以生效,是因为,block不允许修改外部的值,这个值指的是栈中指针的地址,__block所起到的作用是只要观察到该变量被block所持有,就将外部变量在栈中的地址放到堆中,所以在block内部可以修改外部变量的值。
扩展:
循环引用(retain cycle):
当两个对象互相引用的时候就会出现循环引用,解决循环引用的方法:
1、强制将一个对象置nil;
2、将该对象用__weak(ARC环境下)或__block(MRC环境下)修饰之后再引用。
容易出现循环引用三大场景:
1、NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用。
2、block内部使用外部指针。
3、委托delegate