美文网首页
MRC下block的循环引用

MRC下block的循环引用

作者: Jack小麻雀_ | 来源:发表于2021-10-08 23:48 被阅读0次

说明一下造成循环引用的场景,viewController持有某个view,view中持有block,block内部引用vc,造成的循环引用。在arc的环境下使用__weak即可解决问题,但是mrc中不能使用weak关键字(其实是可以在项目配置中设置的,但是考虑到老项目一般都没有开放mrc使用weak的配置,所以不使用weak),使用__block即可。

//view.h
@interface BlockView : UIView
@property(nonatomic, copy)void(^dismissCallback)(void);
@end

//view.m
@implementation BlockView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(jk_tapAction)];
        [self addGestureRecognizer:tap];
        
        [tap release]; tap = nil;
    }
    return self;
}

- (void)dealloc{
    [super dealloc];
}

- (void)jk_tapAction{
    if (self.dismissCallback) {
        self.dismissCallback();
    }
    self.backgroundColor = [UIColor blueColor];
}

@end

//vc.m
@interface BlockViewController ()
@property(nonatomic, retain)UILabel *titleLabel;
@end

@implementation BlockViewController{
    BlockView *_redView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    self.titleLabel.text = @"title";
    [self.view addSubview:self.titleLabel];
    
    __block typeof(self) weakSelf = self;
    _redView = [[BlockView alloc] initWithFrame:CGRectMake(100, 200, 100, 100)];
    _redView.backgroundColor = [UIColor redColor];
    _redView.dismissCallback = ^{
        //如果不使用weakSelf则无法进入dealloc
        weakSelf.titleLabel.text = @"changed";
    };
    [self.view addSubview:_redView];
}

- (void)dealloc{
    [_redView release]; _redView = nil;
    [_titleLabel release]; _titleLabel = nil;
    [super dealloc];
}

demo在这里https://gitee.com/Jack_1993/mrc_-playground
希望能够对在arc时代开始做iOS的大家有帮助:)

相关文章

  • MRC下block的循环引用

    说明一下造成循环引用的场景,viewController持有某个view,view中持有block,block内部...

  • iOS基础 Block解决循环引用

    block 循环引用循环引用 A对象持有B,B又持有A,互相强引用 解决循环引用问题:ARC 和MRC ARC:...

  • Block

    结论: MRC补充: block声明、定义、取别名 传值: 区分MRC和ARC: 循环引用: block值传递 b...

  • 解决block循环引用--MRC

    ?用__unsafe_unretained解决 ?用__block解决

  • __block与__weak的真正区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • __block和__weak修饰符的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • __block与__weak的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • MRC下打破block引用循环的坑

    感觉全世界都是在用ARC,而我还在MRC里挣扎。摊手.jpg 先看看这个crash 重现步骤是制造弱网络环境,清除...

  • __block 和__ weak 的区别

    1:在 block 下循环引用的问题.○ __block 本身并不能避免循环引用,避免循环引用需要在block内部...

  • ios面试题

    最近面试一般问得问题:mrc arc block 循环引用 进程线程 tcp udp runloop runtim...

网友评论

      本文标题:MRC下block的循环引用

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