1、block语法转换的_main_block_func_0函数指针被赋值给_main_block_impl_0结构体的成员变量FuncPtr中,也就是说_main_block_func_0函数的参数函数的参数_main_block_impl_0类型的_cself指向block的值
2、Block的为OC的对象
3、截获自动变量意味着执行block语法时,block语法表达式所使用的自动变量值呗保存到block的结构体实例(即block自身)中,只截获变量的值,储存在block自身struct内部
4、block截获对象的值在block内部,在block中使用附有__strong修饰的id类型或对象类型自动变量的情况下,当block由stack复制到堆上的时候使用_Block_object_assign函数持有截获的对象,当堆上的对象废弃时,使用_Block_object_dispose函数释放Block截获的对象,__block变量中,只要__block变量在堆上继续存在,那么该对象会继续处于被持有状态
5、block截获自动变量截获的是block声明之前的值
6、block 调用-clang转化后会把自身(_cself)作为参数传入_main_block_func_0方法中,作为参数传递的
7、避免循环引用:
????????①__weak:弱引用,不持有,自动置nil
? ? ? ? ②__block:修饰对象,在结束后吧__block修饰的对象手动置nil 断开循环,或者使用结束后把block置nil
8、__block和__weak有什么区别?
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。?__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。?__block对象可以在block中被重新赋值,__weak不可以。