block同时具有函数和实力便来给你的性质,使用起来方便,代码整洁。
1)在块内改变外部变量的值时候,在外部变量前加__block,否则该值在block块内部是只读的。
2)在引用某个实例变量或者所在控制器本身时候,在ARC下,要再前面加__weak如:__weak (typeof(self) weak self = self), 在mrc下用__block, 这样做是为了避免内存泄露和循环引用。
3)在使用block前需要对block指针做判空处理,如果是MRC的编译环境下,要先release掉block对象。
4)在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上(因为block默认是在栈上创建的,如果在定义block的作用于外部使用block那么需要使用copy将block放到堆上)//MRC下:_sucBlock = [callbackBlock copy]; 不copy block会在栈上被回收。
5)将block赋值为空,是解掉循环引用的重要方法。
6)还有一种改法,在block接口设计时,将可能需要的变量作为形参传到block中,从设计上解决循环引用的问题。
7)在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。