容易导致循环引用的场景的解决方案

一、Block

block的内部引用了对象的属性或者方法,导致block保留了对象,同时对象又保留了block,形成循环引用。

解决方案是,在ARC中采用__weak对对象进行弱化,在非ARC中采用__block对对象进行弱化。如下:

@property(nonatomic, readwrite, copy) completionBlock completionBlock;

//========================================
__weak typeof(self) weakSelf = self;
self.completionBlock = ^ {
    if (weakSelf.success) {
        weakSelf.success(weakSelf.responseData);
    }
};

二、NSTimer

类拥有一个_timer属性,_timer的target为这个类,这样就导致了二者同时保留彼此,使二者都不能够正确释放。

解决方案也很简单,就是在确定不用NSTimer时,手动调用NSTimer的invalidate方法,同时将其置为nil。这种方式依赖于开发者的手动调用,不是一个很好地解决方案。

时间: 2024-10-11 19:34:09

容易导致循环引用的场景的解决方案的相关文章

常见的出现内存循环引用的场景有哪些?

定时器(NSTimer):NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用(self->timer->self). 另外,若timer一直处于validate的状态,则其引用计数将始终大于0,因此在不再使用定时器以后,应该先调用invalidate方法 block的使用:block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC).在ARC与非ARC环境下对block使用不当

Block 循环引用(中)

不会造成循环引用的block 大部分GCD方法 1 dispatch_async(dispatch_get_main_queue(), ^{ 2 [self doSomething]; 3 }); 因为self并没有对GCD的block进行持有,没有形成循环引用.目前我还没碰到使用GCD导致循环引用的场景,如果某种场景self对GCD的block进行了持有,则才有可能造成循环引用. block并不是属性值,而是临时变量 1 - (void)doSomething { 2 [self testWi

block浅析与使用block导致循环强引用举例

定义语法 外部变量值截获 改变外部变量值 block变量作用域导致block体从栈复制到堆同时变量持有了block体中截获的变量 block变量作用域导致强引用 typedef void(^BlockType)(NSString *str);//声明一个void(^)(NSString *str)的block类型,类型名为BlockType-(void)viewDidLoad{ int i=[self getValuesFrom:^int(int i, int y) {//算法由自己定,值由别人

iOS开发——Block引起循环引用的解决方案

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题.今天我们主要来讲讲Block中涉及的循环引用问题.当我们自己一开始写代码的时候,可能会大量在block中使用self,但是当看到别人优秀的代码的时候,发现别人常常不是用self,而使用weakSelf. 为什么呢?本文的示例代码上传至 https://github.com/chenyufeng1991/Block_WeakSelf . 首先我先来说说内存管理的原则: 1.默认使用strong,可选weak.stro

iOS容易造成循环引用的几种场景

建议两篇都要看,各有长处 原文1:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7636d918d027fa3c215cc7902155a66e1b821201b19d2c47c640aae5e5c9daa702d691765eadb9e871a83e6c37138895723061f913264c469dfdc3620d621e04d9faf0e93cce74492b9a3d2&p=8778c54a

【原】iOS容易造成循环引用的三种场景,就在你我身边!

======================================================= 原创文章,转载请注明 编程小翁@博客园,邮件[email protected],微信Jilon,欢迎各位与我在C/C++/Objective-C/机器视觉等领域展开交流! ======================================================= ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按

c++智能指针以及循环引用问题(转)

解决循环引用: 在知道存在循环引用的条件下,使用boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环. 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 . c++ 智能指针主要包括:unique_ptr,shared_ptr, weak_ptr, 这三种,其中auto

理解 ARC 下的循环引用

本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚成为苹果开发者,你或许不会关心他们的存在.直到某天你的一个 app 因内存泄露而闪退,你才突然意识到他们的存在,并且发现循环引用像幽灵一样存在于代码的各个角落.年复一年,你开始学会如何处理循环引用,检测和避免它们,但是这部片子的恐怖结局还是在那里,随时可能出现. ARC 令许多开发者(包括我)感到失

IOS中解决ARC类实例间循环引用(Swfit)

原创Blog,转载请注明出处 http://blog.csdn.net/column/details/swfitexperience.html 备注:本文代码和图片主要来自于官方文档 不熟悉ARC的同学可以看看前一篇关于ARC的简述,这个是我的Swfit教程专栏 http://blog.csdn.net/column/details/swift-hwc.html 一.几个用到的关键概念 弱引用(weak):不会增加自动引用计数,必须为可选类型变量,因为弱引用在引用计数为0的时候,会自动赋为nil