博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 容易引“起循环引用”的三种场景
阅读量:6899 次
发布时间:2019-06-27

本文共 1237 字,大约阅读时间需要 4 分钟。

笔者在中总结了一下,在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;
}

转载地址:http://lgsdl.baihongyu.com/

你可能感兴趣的文章
七牛,前端上传图片
查看>>
ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
查看>>
qml 一个信号与多个方法关联 和 c++信号与槽类似写法
查看>>
简说Python生态系统的14年演变
查看>>
response.setHeader的各种用法 ------ 笔记(一)
查看>>
关于@Override
查看>>
java Servlet接口及应用
查看>>
在汇编代码中调用C函数
查看>>
centos6.5 keepalived检测脚本
查看>>
使用Xcode7非美刀购买开发者帐号,非越狱安装IOS ipa
查看>>
并发编程与高并发学习笔记一
查看>>
json的那些事儿
查看>>
9月15日学习内容整理:类的命名空间和组合
查看>>
1419: Red is good
查看>>
Android开源项目分类汇总
查看>>
linux安装svn服务器
查看>>
Structure And Representation Of MIB Object Names - SNMP Tutorial
查看>>
OpenCV教程(46) 快速特征检测
查看>>
verilog语法实例学习(6)
查看>>
实验6
查看>>