zoukankan      html  css  js  c++  java
  • ios block常见的错误(三)——并发编程的block引用

    在一些技术型的企业里面,有关block面试笔试题,将会问得很深,如下例子:

    请问DemoObj的对象能否正确释放,为什么?

    //DemoObj.m
    
    @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(@"demoobj dealloc");
    }
    
    - (void)demoOp:(id)obj
    {
        NSLog(@"%@ %@", [NSThread currentThread], obj);
    }
    
    - (void)demoBlockOp
    {
        for (int i = 0; i < 10; ++i) {
            
            [self.queue addOperationWithBlock:^{
                [self demoOp:@(i)];
            }];
        }
    }
    
    
    //SMViewController.m
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        DemoObj *obj = [[DemoObj alloc] init];
        
        [obj demoBlockOp];
    }

    看过本人上一篇博文的读者可能会回答:DemoObj的对象不能被正确释放,原因是产生了循环引用啊。

    但实际情况是,DemoObj的对象能被正确释放,读者不妨运行试试。

    能被正确释放的原因是: 在并发编程中,block的管理以及线程的创建和销毁是由队列负责!当队列执行完被销毁时队列中得所有对象都会被销毁。

    而循环引用只有在self直接强引用block才会出现。

  • 相关阅读:
    分片副本监控优化备份分词器03
    es score限制
    German Collegiate Programming Contest 2017 G. Water Testing
    SQL注入以及sqlmap初体验
    BUUCTF [极客大挑战 2019]Upload 1
    DVWA—File Upload 文件上传
    DVWA—XSS 跨站脚本攻击
    WUSTCTF2020 佛说:只能四天
    猪圈密码
    2016全国大学生信息安全竞赛 破译
  • 原文地址:https://www.cnblogs.com/Storms/p/3684273.html
Copyright © 2011-2022 走看看