美文网首页
局部变量引起的循环引用

局部变量引起的循环引用

作者: ANTI_JAM | 来源:发表于2017-07-27 17:34 被阅读63次

开发中写了个demo,具体片段如下,创建了三个局部对象Button,通过RAC做相应的按钮事件操作。没想到竟然发现到有内存泄漏的问题。因为已经排除了RAC导致的原因(具体ReactiveCocoa的内存管理可以看:http://blog.csdn.net/y_csdnblog_xx/article/details/51483111),所以刚开始时候也比较一头雾水。但是最后发现代码中犯了一个很低级的错误。

UIButton * btn0 = [[UIButton alloc]initWithFrame:CGRectMake(100, 450, 50, 100)];

[self.view addSubview:btn0];

UIButton * btn1 = [[UIButton alloc]initWithFrame:CGRectMake(200, 450, 50, 100)];

[self.view addSubview:btn1];

[[btn0 rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton * sender) {

//do something...

btn0.selected = YES;

btn1.selected = NO;

}];

[[btn1 rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton * sender) {

//do something...

btn0.selected = NO;

btn1.selected = YES;

}];

正常我们使用RAC或者Block,如果有全局属性在Block中调用并且该Block被本类对象持有,我们都会对self做一个弱引用,更保险一些的话还会在Block中再强引用一下这个指向self的弱引用指针。这个操作就能很有效避免循环引用带来的内存问题。

但是在以上代码中,我并没有创建全局属性并且也没有在Block中调用任何全局属性,结果同样出现了循环引用。我已经意识到了问题肯定出在Block中,就顺着代码排查可能性。我先把btn1的事件响应信号的接收Block中的btn0.selected = NO;去掉,发现问题解决了。因此意识到,即使是局部变量对象,如果存在同样的情况,也会导致循环引用。

具体说明:经过以上代码,有四个地方引用了btn0对象:1.btn0指针。2.self.view。3.btn0自身事件响应信号接收方法的block。4.btn1自身事件响应信号接收方法的block。同样有四个地方引用了btn1对象:1.btn1指针。2.self.view。3.btn1自身事件响应信号接收方法的block。4.btn0自身事件响应信号接收方法的block。这两按钮前三个情况都没问题,关键在于第四种情况。btn0的释放取决于btn1的释放,btn1同样要等btn0释放后才可释放其block进而才可释放。此时就出现了循环引用。

解决办法:给会导致循环引用的局部对象创建弱引用指针供相应Block中使用。

__weak UIButton * weakBtn0 = btn0;

__weak UIButton * weakBtn1 = btn1;

相关文章

  • 局部变量引起的循环引用

    开发中写了个demo,具体片段如下,创建了三个局部对象Button,通过RAC做相应的按钮事件操作。没想到竟然发现...

  • iOS开发 循环引用的几种场景

    delegate 循环引用如果delegate使用strong修饰容易引起循环引用 block 循环引用block...

  • iOS内存优化

    引起内存泄漏的原因 引起内存泄漏的原因主要有三类,如下 循环引用 强引用 非OC对象 1、循环引用。最简单的循环引...

  • NSNotificationCenter引起的循环引用

    @weakify(self);[[NSNotificationCenter defaultCenter] addO...

  • NSTimer引起的循环引用

    NSTimer大多数情况下载viewWillDisappear或者viewDidDisappear中释放就可以。但...

  • swift重温笔记(自动引用计数)

    自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 ...

  • block N连问

    Block 与 循环引用 1、 在所有的Block中,使用self 都会引起循环引用吗? 答:不一定.循环引用的原...

  • Swift Tour Learn (九) -- Swift 语法

    本章将会介绍 自动引用计数的工作机制自动引用计数实践类实例之间的循环强引用解决实例之间的循环强引用闭包引起的循环强...

  • Swift之循环引用

    Swift中的循环引用是怎么样的呢?我们来看看: 调用: 这样是不会引起循环引用的,为什么呢? 要循环引用还要se...

  • 问题:为什么很多内置类如UITableViewControlle

    如果是retain,引用计数+1,可能会引起循环引用。 所有的引用计数系统,都存在循环引用的问题。例如下面的引用关...

网友评论

      本文标题:局部变量引起的循环引用

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