循环引用

原创 2015年07月08日 10:44:58

一、parent-child相互持有、委托模式

【案例】:


1
2
3
4
5
6
@interfaceFTAppCenterMainViewController ()
{
}
 
@property(weak,nonatomic) UITableView* myTableView;
@end
这里面的myTableView就使用了weak修饰符。


1
@property(nonatomic, weak)  id<ftactionsheetdelegate>delegate;</ftactionsheetdelegate>

【推荐方法】:

child只有parent的对象为weak类型:


1
@property(nonatomic, weak)  id<ftactionsheetdelegate>delegate;</ftactionsheetdelegate>

二、block

【案例】:

看下面的代码:


1
2
3
4
5
typedefvoid(^RequestNaviCallBack)(NSInteger naviCode,NSInteger httpCode,NSError * error);
@interfaceFtNaviManager : NSObject
{
}
@property(nonatomic, strong)   RequestNaviCallBack naviCallBack;
这是一个请求导航的类,类属性持有了RequestNaviCallBack,这时,如果RequestNaviCallBack再持有self,必然造成循环引用。

【推荐方法】:

如果有循环引用,编译器会提示警告。

如果对象没有持有Block对象,那么不会产生循环引用。如果对象持有了block对象,那么在block引用self的时候这么定义:


1
__weak typeof(self) weakSelf = self;

三、NSTimer

【案例】:

1
2
3
4
5
6
@interfaceFtKeepAlive : NSObject
{
    NSTimer*              _keepAliveTimer; // 发送心跳timer
}
//实现文件
_keepAliveTimer = [NSTimer scheduledTimerWithTimeInterval:_expired target:self selector:@selector(keepLiveStart) userInfo:nil repeats:YES];

类持有了_keepAliveTimer,_keepAliveTimer又持有了self,造成循环引用。

【推荐方法】:

NSTimer会持有对象,所以:在删除对象之前,需要将timer的invalidate方法。

1
2
3
4
-(void)stopKeepAlive{
    [_keepAliveTimer invalidate];
    _keepAliveTimer = nil;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java对象循环引用,Java gc 如何回收

在C++中使用过智能指针的同学们应该都清楚智能指针对C++中内存管理带来的极大便利,但是也会引入一些头疼的问题,比如智能指针带来的循环引用的问题,这个问题在之前的项目中一直没有很好的解决。     ...
  • Leonardo9029
  • Leonardo9029
  • 2015年12月09日 20:37
  • 4677

python循环引用的解决办法

原文地址:http://blog.csdn.net/handsomekang/article/details/19010407 在python中常常会遇到循环import即circular impo...
  • daijiguo
  • daijiguo
  • 2016年09月03日 15:31
  • 3994

避免循环引用

ARC转换总结+避免循环引用 字数970 阅读227 评论0 喜欢2 参考 上面的文章写得已经非常全面了,不过还是有些东西需要补充一下。 循环引用 循环引用和ARC没有直接关系,但是在转换...
  • scut1135
  • scut1135
  • 2016年02月20日 18:39
  • 1082

正确使用Block避免循环引用(一)

正确使用Block避免循环引用
  • wuyulunbi12580
  • wuyulunbi12580
  • 2016年10月09日 23:22
  • 662

[ Javascript ] 内存泄露以及循环引用解析

内存泄露 在javascript中,我们很少去关注内存的管理。我们创建变量,使用变量,浏览器关注这些底层的细节都显得很正常。 但是当应用程序变得越来越复杂并且ajax化之后,或者用户在一个页面停留...
  • yangzhihello
  • yangzhihello
  • 2015年07月11日 16:43
  • 2395

循环引用和解决方案

如何处理循环引用问题? 什么是循环引用?顾名思义,两个对象之间形成环路。对于C++中两个对象来讲,使用智能指针解决不了这个问题。因为其引用计数不为0。循环引用解决办法循环引用涉及的问题是垃圾回收(Ga...
  • niaolianjiulin
  • niaolianjiulin
  • 2017年07月26日 17:16
  • 213

Spring中bean循环引用的处理

最近在项目中遇到Bean循环引用的问题 问题是这样的:Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationExce...
  • liang16286
  • liang16286
  • 2016年10月09日 19:03
  • 1718

shared_ptr循环引用问题

我们大家都知道shared_ptr是采用引用计数的方式进行。但是它存在一个问题:#define _CRT_SECURE_NO_WARNINGS 1#include #include #includeu...
  • qq_26768741
  • qq_26768741
  • 2016年09月04日 08:58
  • 1107

EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json

1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出...
  • u011127019
  • u011127019
  • 2016年06月18日 18:24
  • 4930

对象循环引用与序列化问题

几种序列化方案对循环引用的对象的处理及一般规律
  • nblife0000
  • nblife0000
  • 2017年02月22日 18:51
  • 1222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:循环引用
举报原因:
原因补充:

(最多只允许输入30个字)