美文网首页
iOS循环引用

iOS循环引用

作者: csii993 | 来源:发表于2018-07-16 11:02 被阅读84次

什么是循环引用?

循环引用:是指多个对象相互引用,导致内存无法释放,从而导致内存泄露。

循环引用的四种情况?

  • 父类与子类
  • Block
  • Delegate
  • NSTime

1、父类与子类

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TestTableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"UITableViewCellIden" forIndexPath:indexPath];
    cell.tableView = tableView;
    return cell;
}

以下代码会引起循环引用

@interface TestTableViewCell : UITableViewCell
@property (nonatomic, strong) UITableView *tableView;
@end

原因

因为tableView 的strong属性特质,使得子类持有父类,应该使用weak

解决方案

@interface TestTableViewCell : UITableViewCell
@property (nonatomic, weak) UITableView *tableView;
@end

2、Block

typedef void (^TestCircleBlock)();
@property (nonatomic, copy) TestCircleBlock testCircleBlock;

if (self.testCircleBlock) {
    // 具体实现
    self.testCircleBlock();
}

以下代码会引起循环引用

self.testObject.testCircleBlock = ^{
   [self doSomething];
};

原因

该类将block作为自己的属性变量并持有,而该类在block的方法体里面又使用了该类本身

解决方案

__weak typeof(self) weakSelf = self;
 self.testObject.testCircleBlock = ^{
      __strong typeof (weakSelf) strongSelf = weakSelf;
      [strongSelf doSomething];
};

3、Delegate

以下代码可能会引起循环引用

@property (nonatomic, strong) id <TestDelegate> delegate;

解决方案

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

4、NSTimer

以下代码可能会造成循环引用

#import "FirstViewController.h"

@interface FirstViewController ()
@property (nonatomic, strong) NSTimer *timer;
@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor redColor];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(testTimerDeallo) userInfo:nil repeats:YES];
}

/** 方法一直执行 */
-(void)testTimerDeallo{
    
    NSLog(@"-----");
}

/** 开启定时器以后控制器不能被销毁,此方法不会被调用 */
-(void)dealloc{
    NSLog(@"First");
    // [self.timer invalidate];
}

解决方案

//在进入界面时创建
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //[self.timer setFireDate:[NSDate distantPast]];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(testTimerDeallo) userInfo:nil repeats:YES];
}
//在界面即将消失时销毁
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.timer invalidate];
}

相关文章

  • iOS闭包循环引用精讲

    iOS闭包循环引用精讲 iOS闭包循环引用精讲

  • 如何在 iOS 中解决循环引用的问题

    如何在 iOS 中解决循环引用的问题 如何在 iOS 中解决循环引用的问题

  • iOS复习之Block

    iOS面试中如何优雅回答Block iOS block循环引用

  • iOS中Timer循环引用的原因以及解决办法。

    循环引用是iOS面试当中经常会被问到的东西,而在循环引用当中,最典型的是Timer造成的循环引用,Timer为什么...

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

  • iOS 循环引用

    关于循环引用看着3篇文章就够了,拿走不谢! 循环引用 循环引用 OC中的block OC中的block 关于 bl...

  • iOS循环引用

    以下所有内容属笔者原创, 如有雷同纯属巧合, 未经允许不得转载. 这篇内容主要讲解 定时器 中的循环引用, 常见...

  • iOS循环引用

    在iOS开发中,循环引用是个老生常谈的问题.delegate为啥使用weak修饰,block为什么需要weakSe...

  • iOS循环引用

    什么是循环引用? 循环引用:是指多个对象相互引用,导致内存无法释放,从而导致内存泄露。 循环引用的四种情况? 父类...

  • ios循环引用

    首先,研究ios循环引用,离不开怎么使用strong和weak类型的引用和mrc下内存管理和arc下的内存管理。a...

网友评论

      本文标题:iOS循环引用

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