美文网首页
常见循环引用探究

常见循环引用探究

作者: 独孤流 | 来源:发表于2019-04-10 11:56 被阅读0次

在OC开发中有基本常识,一旦使用block就容易产生循环引用,但很多时候不得不使用,总结整理了容易出现循环引用以及如何避免出现循环引用的方式

@interface TestMemoryLeak () 
{
     NSString *_memberVar;// 成员变量
}
@property(nonatomic, assign) NSInteger propertyVar;// 属性变量
@property(nonatomic, copy) dispatch_block_t block; // block
@end

@implementation TestMemoryLeak
- (void)viewDidLoad 
{
    [super viewDidLoad];
    [self testwillLeak];
    [self testWillNotLeak];
    // 这里不会产生循环引用,因为这个延迟执行block不被self所持有,当然为了方便简单不用考虑是否被持有,统一使用weakSelf也可以
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.block();
    });
     __weak __typeof(self)weakSelf = self;
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        weakSelf.block();
    });
}
@end

一、会产生循环引用的使用方式

- (void)testwillLeak
{
    // 会产生循环引用的使用方式
        self.block = ^(){
            NSLog(@"%ld",self.propertyVar);
        };
        self.block = ^(){
            NSLog(@"%ld",self->_propertyVar);
        };
        self.block = ^(){
            NSLog(@"%ld",_propertyVar);
        };
        self.block = ^(){
            NSLog(@"%@",self->_memberVar);
        };
        self.block = ^(){
            NSLog(@"%@",_memberVar);
        };
}

二、不会产生循环引用的方式

// 不会产生循环引用的方式
    __weak __typeof(self)weakSelf = self;
    self.block = ^(){
        NSLog(@"%ld",weakSelf.propertyVar);
    };
    self.block = ^(){
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        NSLog(@"%ld",strongSelf.propertyVar);
    };
    self.block = ^(){
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        NSLog(@"%ld",strongSelf->_propertyVar);
    };
    self.block = ^(){
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        NSLog(@"%@",strongSelf->_memberVar);
    };

相关文章

  • 常见循环引用探究

    在OC开发中有基本常识,一旦使用block就容易产生循环引用,但很多时候不得不使用,总结整理了容易出现循环引用以及...

  • Block循环引用的四种解决方案

    Block常见的循环引用模型 以下是常见的Block循环引用模型,self引用block,block引用self,...

  • Block循环引用探究

    前言 关于Block的循环引用问题,相信我们面试的时候经常被问到,第一时间你就会想到使用__weakSelf 代替...

  • Block循环引用的两种情况(self和私有成员变量)

    Block的循环引用问题非常常见 1、Block 内部引用 self,造成循环引用 (1)这种 Block 循环引...

  • Block的循环引用探究

    Block属性修饰用copy 在将block由栈区 拷贝到堆区后block内部会自动产生对外界的强或弱引用 具体是...

  • NStimer的循环引用探究

    代码如下 可以看到timer与控制器之间有相互强引用的关系 dealloc不会执行原因无非是 当前控制器 对 ti...

  • iOS可能导致内存泄漏的情况

    1.循环引用 常见于两个VC相互引用,通过@class解决; block 循环引用,通过__weak解决。 Use...

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block 各个修饰符的说明

    一.ARC下用块(block)的循环引用问题样例探究: 当页面跳转时,看界面是否有循环引用,如果控制器不走deal...

  • iOS开发中的循环引用

    循环引用的实质是,多个对象之间相互强引用,导致不能释放,让系统回收。iOS开发中常见的循环引用主要是由Delega...

网友评论

      本文标题:常见循环引用探究

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