博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
循环引用的案例
阅读量:6217 次
发布时间:2019-06-21

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

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

【案例】:

 

1
2
3
4
5
6
@interface
FTAppCenterMainViewController ()
{
}
 
@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
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;
}

转载于:https://www.cnblogs.com/fantasy3588/p/5391349.html

你可能感兴趣的文章
pom格式
查看>>
mybatis中的#和$的区别
查看>>
Barareh on Fire
查看>>
Zabbix之配置文件详解
查看>>
extjs 回车键
查看>>
acm 小球 下落 (二叉树的应用)
查看>>
Android Studio如何集成Genymotion
查看>>
memcache与Redis
查看>>
这两道题目很相似 最优还钱方式 & 除法推导
查看>>
第9组 软件分析与用户体验分析
查看>>
北风设计模式课程---7、建造者模式
查看>>
JS中给函数参数添加默认值(多看课程)
查看>>
JSON 教程
查看>>
手工编写JavaWeb项目
查看>>
Ubuntu获取root权限
查看>>
imageview.scaletype ImageView的加载方式(转载)
查看>>
Python基本语法_函数_参数的多类型传值
查看>>
OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发
查看>>
微信小程序保存图片的方法
查看>>
JavaScript----UI的松耦合
查看>>