-
笔者在阅读中总结了一下,在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
【案例】:
看下面的代码:
12
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
【案例】:
12
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方法。
12
3
4
-(
void
)stopKeepAlive{
[_keepAliveTimer invalidate];
_keepAliveTimer = nil;
}
iOS 容易引“起循环引用”的三种场景
时间: 2024-10-06 04:32:23
iOS 容易引“起循环引用”的三种场景的相关文章
【原】iOS容易造成循环引用的三种场景,就在你我身边!
======================================================= 原创文章,转载请注明 编程小翁@博客园,邮件[email protected],微信Jilon,欢迎各位与我在C/C++/Objective-C/机器视觉等领域展开交流! ======================================================= ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按
iOS 容易造成循环引用的三种场景
循环引用的简单理解: A引用B,B又引用A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放. 一:Block 1.ARC环境下: 使用__weak声明一个代替self的新变量代替原先的self: 2.MRC环境下:使用__block . 二:代理 ARC环境下:声明代理时使用弱引用weak; MRC环境下:声明代理时使用assign. 三:NSTimer
iOS容易造成循环引用的三种场景NSTimer以及对应的使用方法(一)
NSTimer A timer provides a way to perform a delayed action or a periodic action. The timer waits until a certain time interval has elapsed and then fires, sending a specified message to a specified object(timer就是一个能在从现在开始的未来的某一个时刻又或者周期性的执行我们指定的方法的对象)
iOS容易造成循环引用的几种场景
建议两篇都要看,各有长处 原文1:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7636d918d027fa3c215cc7902155a66e1b821201b19d2c47c640aae5e5c9daa702d691765eadb9e871a83e6c37138895723061f913264c469dfdc3620d621e04d9faf0e93cce74492b9a3d2&p=8778c54a
【少年,放松~】出现block循环引用的三种情况和处理办法
刚入职在看已经上线的项目,其中用到block进行快捷回调的做法很常用,但是Xcode都给给以了如下[循环引用]的警告(如下)的情况,结合网络上的查找和自己的理解,进行总结如下. // Capturing 'self' strongly in this block is likely to lead to a retain cycle 出现这种情况的原因主要是:因为block的特性,声明block的对象都会以copy的形式持有block,而block对于它内部的对象也会进行强引用,从而导致了循环引
IOS中Block的循环引用
@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"
Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖
目录 Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖 1. 循环依赖问题 2. 准备实验 3. 原因分析 4. 解决方案 5. 还有什么问题 6. 总结 Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖 Spring 系列目录:https://www.cnblogs.com/binarylei/p/10198698.html 本章讨论的范围:AbstractFactoryBean 创建单例 Bean 过程中出现的循环依赖问
指针与引用的区别以及引用的三种用法
1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一
iOS开发——Block引起循环引用的解决方案
内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题.今天我们主要来讲讲Block中涉及的循环引用问题.当我们自己一开始写代码的时候,可能会大量在block中使用self,但是当看到别人优秀的代码的时候,发现别人常常不是用self,而使用weakSelf. 为什么呢?本文的示例代码上传至 https://github.com/chenyufeng1991/Block_WeakSelf . 首先我先来说说内存管理的原则: 1.默认使用strong,可选weak.stro