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才会出现。

  • 相关阅读:
    14.2.3 InnoDB Redo Log
    14.2.3 InnoDB Redo Log
    14.2.2 InnoDB Multi-Versioning InnoDB 多版本
    mysql union ,UNION RESULT
    mysql union ,UNION RESULT
    mysql 查询优化案例
    视图上无法创建索引
    视图上无法创建索引
    /etc/security/limits.conf 设置
    14.2.1 MySQL and the ACID Model
  • 原文地址:https://www.cnblogs.com/Storms/p/3684273.html
Copyright © 2011-2022 走看看