iOS循环引用问题

今天面试问道了循环引用,所以就看了看,原来只是知道使用了Block容易造成循环引用。今天就来简单的介绍一些循环引用。

先来简单介绍一下什么是循环引用?

循环引用可以简单的理解成:A对象引用了B对象,B对象又引用了A对象。两者相互保持对方的一个引用。导致任何时候计数都不为0,最终两者都无法释放。

产生循环引用的方式:

1、NSTimer

比如说我在一个类中声明了一个NSTimer计时器类。而在NSTimer 的方法

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
                                     target:(id)target
                                   selector:(SEL)aSelector
                                   userInfo:(id)userInfo
                                    repeats:(BOOL)repeats

当我们在aSelector中调用了自己的属性或者方法时(比如调用了自己的self.class),那么当我们实例化这个类之后然后我们让他延迟几秒释放,那么我们会发现time中的aSelector会一直执行。现在就来简单的分析一下吧:

timer没有调用invalidate方法是不会因为类的释放而停止的。而对于类实例来说:它认为timer没有执行完毕,所以没有机会进入dealloc。循环引用,相互等待。所以我们可以在类实例释放之前手动调用一下NSTimer的invalidate方法。还有就是下面的代码:

__weak ClassA *weakSelf = self;
timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:weakSelf selector:@selector(startTimer) userInfo:nil repeats:YES];

 

所以我们在使用NSTimer时一定要注意NSTimer的invalidate时机。

2、Block

例如我们定义了一个block块,然后作为了一个类的属性变量,那么当我们在这个块中调用自己的属性或者方法的时候就会产生循环引用。

解决循环引用方法:通过__weak声明一个self的新变量来代替原来的self。这样在块中可以通过这个弱引用self来防止block中对self进行strong引用。

3、delegate

一般情况下我们声明delegate时使用assign赋值,因为赋值属性不会增加计数。

如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a, 如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。

先简单的介绍这么多,因为这边没有电脑,也不太方便进行例子演示。有电脑了再补上去。这里先做一下记录。

------------------------------------------------------------------------------------结束------------------------------------------------------------------------------------

也很感谢哪位大神能够附上一些例子。

时间: 2025-01-29 15:29:13

iOS循环引用问题的相关文章

ios-谁能用简单的、真实的、代码的形式解释iOS的循环引用

问题描述 谁能用简单的.真实的.代码的形式解释iOS的循环引用 网上关于iOS循环引用论述最多的就是那个什么a引用了bb引用了cc引用了ba release之后,b c泄漏 完全没理解,b和c个自release对方不就完了么??? 谁能用真实代码的例子告诉我什么是循环引用吗?什么ObjectA *a = [ObjectA alloc];ObjectA *b = [a copy];这样的伪代码就不要了!因为一般ObjectA都没有实现copy方法!

iOS闭包循环引用精讲

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题.对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来. 声景一:Controller之间block传值 现在,我们声明两个控制器类,一个叫ViewContr

iOS - NSTimer循环引用的解决办法

发生场景 在 Controller B 中有一个 NSTimer @property (strong, nonatomic) NSTimer *timer;  你创建了它,并挂载到 main runloop self.timer = [NSTimer scheduledTimerWithTimeInterval:1   target:self selector:@selector(timerAction:) userInfo:nil repeats:true];  然后退出 Controller

block使用小结、在arc中使用block、如何防止循环引用(zz)

标签:  __block   __weak   arc   self   cfgetretaincount 分类: iOS zz from http://www.cnbluebox.com/?p=255 引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代

JavaScript中的内存泄露模式:在JavaScript应用程序中处理循环引用

如果您知道内存泄漏的起因,那么在 JavaScript 中进行相应的防范就应该相当容易.在这篇文章中,作者 Kiran Sundar 和 Abhijeet Bhattacharya 将带您亲历 JavaScript 中的循环引用的全部基本知识,向您介绍为何它们会在某些浏览器中产生问题,尤其是在结合了闭包的情况下.在了解了您应该引起注意的常见内存泄漏模式之后,您还将学到应对这些泄漏的诸多方法. JavaScript 是用来向 Web 页面添加动态内容的一种功能强大的脚本语言.它尤其特别有助于一些日

Unity Application Block 1.0系列(6):杜绝循环引用

在介绍 Constructor Injection.Property Injection和 Method Call Injection时,都有特别提到不要出现循环引用(Circular References),因为出现这种问题后很难去检测到.最好的解决方法是写代码时候尽量避免出现这种情况. 下面看看循环引用的几个场景,在使用依赖注入框架时应该尽量避免出现这样的情况: 1.通过Constructor Injection生成的对象在构造器的参数中互相引用 public class Class1{ p

Excel中循环引用的用法

  Excel中循环引用的用法          提到循环引用,恐怕很多同学都不会陌生,而且会敬而远之.在Excel中输入公式时,经常会遇到下面的提示框,这就是因为公式中有循环引用的问题导致的. 通常情况下,如果公式中包含对其他单元格或者运算结果的引用,无论是直接还是间接,都不能包含对自身取值的引用.

Excel总是弹出循环引用警告怎么办?

  很多人在打开Excel的时候会频繁弹出"循环引用警告"这是怎么回事?是什么原因造成的?如何阻止弹出呢?请看下面的解决办法. Excel总是弹出循环引用警告怎么办?如何解决 原因:公式引用的对象,直接或间接地引用了当前单元格本身.所以给出错误提醒. 循环引用是指在excel公式中自已直接或间接的引用自已,如下面的公式 C10 =SUM(C6:C10) 'c10中设置的求和公共包括它本身 当表格中含有循环引用时,每次打开表格都会出现提示,如下图所示. 如何能快速找到循环引用的公式地址呢

序列化 循环引用-对象序列化时遇到循环引用

问题描述 对象序列化时遇到循环引用 大致的业务时这样的,简单的来说就是员工的信息中需要显示部门的相关信息,在员工类中定义了部门类型的成员,部门也要中包括员工的姓名等信息,部门类中也定义了员工类的集合.public class Emp(){ protected string name; protected Dept dept; } public class Dept(){ public string name; public List emplist; } 在用javaScriptSerializ