block的底层原理

2019-01-14  本文已影响0人  逗憨de憨

一、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?

不需要

上一篇下一篇

猜你喜欢

热点阅读