笔者在阅读中总结了一下,在iOS平台容易引起循环引用的四个场景:

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

【案例】:

 
@interface FTAppCenterMainViewController ()
{
}
 
@property(weak,nonatomic) UITableView* myTableView;
@end
这里面的myTableView就使用了weak修饰符。

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

【推荐方法】:

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

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

二、block

【案例】:

看下面的代码:

1
2
3
4
5
typedef void (^RequestNaviCallBack)(NSInteger naviCode,NSInteger httpCode,NSError * error);
@interface FtNaviManager : 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
@interface FtKeepAlive : 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;
}

iOS 容易引“起循环引用”的三种场景的更多相关文章

  1. iOS容易造成循环引用的三种场景

    iOS容易造成循环引用的三种场景  ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理解为 ...

  2. 【转】iOS学习之容易造成循环引用的三种场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...

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

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...

  4. iOS-容易造成循环引用的三种场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引 用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都 ...

  5. Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

    话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...

  6. 浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  7. Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)

    本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...

  8. OC与Swift混编,三种场景的实现方式

    多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...

  9. iOS 里面 NSTimer 防止 循环引用

    使用NSTimer的类 #import "TBTimerTestObject.h" #import "TBWeakTimerTarget.h" @interfa ...

随机推荐

  1. HDU_2042——递归反推

    Problem Description 你活的不容易,我活的不容易,他活的也不容易.不过,如果你看了下面的故事,就会知道,有位老汉比你还不容易.重庆市郊黄泥板村的徐老汉(大号徐东海,简称XDH)这两年 ...

  2. 二叉树后序遍历的非递归算法(C语言)

    首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问 ...

  3. 状态模式(State) 笔记

    让一个对象随着内部的状态改变而发生改变. 状态的两种切换方式: 1) 完全交给Context类切换, 2) 给Context初始化状态,其他的切换根据每一个State类进行切换,Context对象不再 ...

  4. C语言自动类型转换

    自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成lo ...

  5. 带有中文的url和NSString中文的转换

    NSString *url = @"http://tw.news.yahoo.com/麵包魂東京吸睛-粉絲包圍導演-061222049.html"; NSLog(@"ur ...

  6. VB.NET入门基础

    众所周知,Visual Basic.NET是由Visual Basic发展而来,这两者之间的升级使得Visual Basic语言发生了革命性的变革,使得由基于对象编程的Visual Basic过渡到了 ...

  7. 让你的java开发变得如此 Smart

    http://my.oschina.net/huangyong/blog/196408

  8. [ES6] Module export

    Default export: Default export is easy way to export a function to outside module. //flash-message.j ...

  9. verilog流水线加法器

    四位加法器 两级加法实现 verilog code module pipeliningadder( output reg [3:0] s, output reg co, input [3:0] a, ...

  10. mybati之day02

    今天开始讲解mybatis的第二天内容  一,拼接sql 在mapper.xml中,会多次使用到同一条sql片段,这时为了简便书写,将其定义出来 <sql id="base_sql&q ...