一、block的本质
. block本质上也是一个OC对象,它内部也有个isa指针
. block是封装了函数调用以及函数调用环境的OC对象
c++文件中的原型:
二、blcok的捕获:
三、blcok的分类:
四、copy的作用
五、对象类型的auto变量
eg:
六、block的修饰
通过c++文件查看本质:
_ _ block的本质窥探:
七、_ _ block的内存管理
对于auto变量的内存管理:
1.当__block变量在栈上时,并不会对__block变量产生强引用
2.当block被拷贝到堆时 ,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会对__block变量形成强引用(retain)
3.当block从堆中移除时,会调用block内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数,_Block_object_dispose函数会自动释放引用的_block变量(release)
对于对象类型变量的内存管理:
1.当__block变量在栈上时,不会对指向的对象产生强引用。
2.当__block变量被copy到堆时,会调用__block变量内部的copy函数,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会根据所指向对象的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain)
3.当__block变量从堆中移除时,会调用__block变量内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数,_Block_object_dispose函数会自动释放所指向的对象(release)
八、循环引用问题
在ARC环境下,解决循环引用的问题:
1.利用__weak、__unsafe_unretained解决。
__weak :使得block内部使用弱指针访问外面的变量
写法一: __weak DMXPerson *weakPerson = person;
写法二:__weak typeof(person) weakPerson = person;
__weak、__unsafe_unretained两者之间的区别:
__weak:不会产生强引用,指向的对象销毁时,会自动让指针置为nil
__unsafe_unretained:不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变
2.利用__block解决(但是必须得调用block,block内部需要清空指针,打破循环,否则还是会导致循环引用,所以解决循环引用的问题首选第一种方式__weak)
在MRC环境下,解决循环引用的问题:
1.MRC环境下不支持__weak,故可以使用__unsafe_unretained解决。
2.也可以使用__block来解决。
在MRC环境下,不会对被修饰的对象进行retain操作。
九.有关block的面试题:
block的原理是怎样的?本质是什么?
block本质上也是一个OC对象,它内部也有个isa指针。是封装了函数调用以及函数的调用环境的OC对象。
__block的作用是什么?有什么使用注意点?
通过__block的修饰,可以使auto变量包装成一个对象,可以解决block内部无法修改auto变量值的问题。
使用注意点:在MRC环境下,不会对被修饰的对象进行retain操作
block的属性修饰词为什么是copy?使用block有哪些使用注意事项?
block一旦没有进行copy操作,就不会在堆上(可以控制它的生命周期),而是在栈上(系统控制其生命周期)。
注意循环引用的问题
block在修改NSMutableArray,需不需要添加__block?
不需要
网友评论