美文网首页
第六章、Block相关

第六章、Block相关

作者: Evans_Xiao | 来源:发表于2019-08-09 21:33 被阅读0次

一、你都遇到过哪些循环引用?你又是怎么解决的?

1、NSTimer
创建使用NSTimer的时候,NSTimer会默认对当前self有个强引用,所有在self使用打算完成的时候,一定要先使用NSTimerinvalidate来停止是否时间控制对self的引用。

[_timer invalidate];

2、Block
Block也是比较常见的循环引用问题,在Block中使用了self容易出现循环引用,因此很多人在使用block的时候,加入里面有用到self的操作都会声明一个__weak来修饰self。其实便不是这样的,不是所有使用了Block都会出现self循环引用问题,只有self拥有Block的强引用才会出现这种情况。
所以一般在函数中临时使用Block是不会出现循环应用的,因为这时候Block引用是属于栈的。当栈上的Block释放后,Block中对self的引用计数也会减掉。
当然不一定要self对Block有直接的引用才会出现,假如self的变量B,B中有个Block变量,就容易出现这种情况,需要注意的是在Block出现循环引用的,Xcode7之后的版本会出现警告提示(之前版本不确定)。

3、delegate
delegate是iOS中开发中最常遇到的循环引用,一般在声明delegate的时候都要使用弱引用weak或者assign

@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;

当然怎么选择使用assign还是weak,MRC的话只能用assign,在ARC的情况下最好使用weak,因为weak修饰的变量在是否后自动为指向nil,防止不安全的野指针存在。

二、对Block基本的认识

本质上也是一个OC对象,它内部也有一个isa指针,是封装了函数调用以及函数调用环境的OC对象。

根据Block的内存地址,系统把Block分为3类:
NSGlobalBlock:全局Block,位于内存全局区。内部没有引用局部变量
NSMallocBlock:堆区Block,位于内存堆区。引用了局部变量,存放的位置是堆区
NSStackBlock:栈区Block,位于内存栈区。其实上面的Block在声明的时候其实默认隐藏了参数,默认参数是__strong,对应的是__weak,在ARC环境下,如果用__weak修饰的Block,就会生成栈区Block(NSStackBlock);当然,如果Block内部没有引用外部变量,那么它还是全局的Block

由此可见,Block是什么类型,主要是由两个因素决定的:
一个是是否引用了局部变量;
一个是是否是使用strong修饰的。

三、为什么Block会产生循环引用?

Block里面使用self不一定会引起循环引用。循环引用的原因是相互指引,相互是关键。如果相互这一层关系达不到就没有所谓的循环引用。

那么具体什么情况下会引起循环引用?
1、强引用自定义的Block,里面再次调用self,导致的循环引用。
2、循环引用的发生的条件就是强持有这个Block,并且被Block里面的加入的对象强持有。
3、使用NSNotification使用系统自带的Block会发生循环引用。

四、Block为什么要是用copy修饰符

因为Block变量默认为栈变量,为了能够在Block声明的作用域外使用,所以把Block拷贝到堆上去。

简单来说,为了Block属性声明和实际的操作一致,最好声明为copy

五、怎么理解Block截获变量的特性?

1、局部变量:基本数据类型,对象类型(对于基本数据类型的局部变量截获其值,对于对象类型的局部变量连同所有权修饰符一起截获)
2、静态局部变量:以指针形式截获局部静态变量
3、全局变量:不截获全局变量
4、静态全局变量:不截获静态全局变量

相关文章

  • 第六章、Block相关

    一、你都遇到过哪些循环引用?你又是怎么解决的? 1、NSTimer创建使用NSTimer的时候,NSTimer会默...

  • [25]Effective Objective-C 2.0【37

    第六章:Block与GCD 第三十七条:理解block 1.根据block在内存中的位置,block被分成三种类型...

  • block相关

    是写在方法里的,在方法里定义个block,有返回值的,以;结尾,block只有被调用的时候才能执行 {} 里的代码...

  • Block相关

    bock常用写法: 1、无返回值 & 无参数 2、有返回值 & 无参数 3、有返回值 & 有参数 4、 block...

  • Block相关

    Block基本使用 1.1、block声明:返回值(^block变量名)(参数)void(^block)(); 1...

  • Block相关

    https://www.jianshu.com/p/4e79e9a0dd82

  • Block相关

  • Block相关

    Block 一:结构相关Block是一个包含了上下文变量的对象,该对象包含了_block_impl结构体,上下文变...

  • Block相关

    类型 1.NSGloabalBlock 全局block,存储在全局区 该block无参数,无返回值,内部也没有引用...

  • Block相关

    整理一下自己学到的知识,方便以后查看 使用block时什么情况会发生引用循环,如何解决? 一个对象中强引用了blo...

网友评论

      本文标题:第六章、Block相关

      本文链接:https://www.haomeiwen.com/subject/ndpkjctx.html