美文网首页
iOS 内存泄漏之循环引用

iOS 内存泄漏之循环引用

作者: oceanfish | 来源:发表于2016-09-07 11:06 被阅读284次

何为循环引用?
简单理解:对象A强引用B,对象B也强引用A;

何时会发生循环引用?
使用delegate、block的时候

Example:
新建一个Friend类如下:

#import <Foundation/Foundation.h>

typedef void(^FriendBLK)(NSString *name);

@interface Friend : NSObject
@property (nonatomic, strong) NSArray *arr;
@property (nonatomic, copy) FriendBLK block;

@end
#import"Friend.h"
@implementationFriend
- (id)init
{
if(self= [superinit]) {
self.arr=@[@111,@222,@333];
self.block= ^(NSString*name){
NSLog(@"name :%@ , block arr:%@", name, name);
};
}
returnself;
}
- (void)dealloc{
NSLog(@"Friend dealloc");
}
@end

然后使用的地方调用下:

Friend*f = [[Friendalloc]init];
f.block(@"yk-test");

当f所在的runloop结束时,会发现控制台打印
2016-09-07 10:20:15.264 RACDemo[2459:23583] name :yk-test , block arr:yk-test
2016-09-07 10:20:15.264 RACDemo[2459:23583] Friend dealloc
这表明f对象被释放了,不存在内存泄漏。然后我们稍微修改下代码:

�再次运行下,发现只会打印
2016-09-07 10:27:24.216 RACDemo[2510:28277] name :yk-test , block arr:(
111,
222,
333
)
并不会调用dellaoc释放self 也就是f对象未被释放,即存在内存泄漏;为了更好理解引用循环问题,我们添加一个延迟队列,代码如下:

然后发现f对象也是不释放的,下面来分析原理:

外面f.block(@"yk-test");结束后,需要释放f对象,通知即将释放,但是这时候block内部还在强引用自己的arr�数组。�Runloop发现f的retain count不为0,于是乎f就不能释放。等到block里面的引用self释放之后,也就是retain count为0时,才能正在释放;

解决方案:弱引用
__weak__typeof(self)wself =self; 或者使用@weakify() @strongify()

原理示意图:


基本Block的问题解决了。其实我们在使用delegate的时候也会出现同样的问题,所以使用delegate都用weak,而不能用strong;


以上就是日常开发的内存泄漏之循环引用了,有不对的地方请留言;

相关文章

  • iOS 内存泄漏之循环引用

    何为循环引用?简单理解:对象A强引用B,对象B也强引用A; 何时会发生循环引用?使用delegate、block的...

  • 循环引用

    由于iOS采用的引用计数,来管理内存,如果相互强引用持有,则无法释放,从而造成内存泄漏。 避免循环引用的规则 1、...

  • ARC模式下的循环引用引起内存泄漏

    ARC模式下的循环引用引起内存泄漏 ​ 自从iOS 5时代自动引用计数(Automatic Reference...

  • iOS内存优化

    引起内存泄漏的原因 引起内存泄漏的原因主要有三类,如下 循环引用 强引用 非OC对象 1、循环引用。最简单的循环引...

  • IOS循环引用、内存泄漏、野指针

    一、循环引用和内存泄漏 1、block循环引用 分析:因为WGBlockTestViewController强引用...

  • NSTimer,NSRunLoop,autoreleasepoo

    引言 NSTimer内存泄漏真的是因为vc与timer循环引用吗?不是! 小伙伴们都知道,循环引用会造成内存泄漏,...

  • Swift中Weak References弱引用和Unowned

    循环引用 循环引用在iOS开发中是需要非常重视的一个问题,不合理的循环引用会导致内存的泄漏,这在开发中是非常危险的...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • ios学记0016-循环引用问题的解决方法

    Block,NSTimer循环引用问题的解决方法 摘要:NSTimer, Block, 循环引用, 内存泄漏 注:...

  • iOS 循环引用导致内存泄漏

    首先我们需要先了解什么是循环引用 循环引用简单来说循环引用就是 A持有B B持有C C持有A ,因为相互持有,导致...

网友评论

      本文标题:iOS 内存泄漏之循环引用

      本文链接:https://www.haomeiwen.com/subject/hjsjettx.html