博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios block常见的错误(三)——并发编程的block引用
阅读量:4700 次
发布时间:2019-06-09

本文共 952 字,大约阅读时间需要 3 分钟。

在一些技术型的企业里面,有关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才会出现。

转载于:https://www.cnblogs.com/Storms/p/3684273.html

你可能感兴趣的文章
Log4j知识汇总
查看>>
20120918-LIST类定义《数据结构与算法分析》
查看>>
《linux c编程指南》学习手记1
查看>>
【JavaScript】各种事件
查看>>
函数的动态参数和作用域
查看>>
Silver Cow Party
查看>>
css框模型、定位、浮动
查看>>
重载操作符解析(原)
查看>>
【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
查看>>
仿百度手机助手标题栏透明度随ListView或ScrollView滚动改变的实现方法
查看>>
easyUI 如何不跳转页面,只是加载替换center部分内容
查看>>
BICEP单元测试——随机四则运算升级版
查看>>
TCP/IP,Http,Socket,XMPP的区别
查看>>
PL/SQL Developer-官网下载地址
查看>>
HDU1249_三角形切割平面
查看>>
mac osx 快捷键
查看>>
ASP.NET MVC下使用AngularJs语言(一):Hello your name
查看>>
java解析XML大全(转)
查看>>
移上显示大图
查看>>
凯撒密码、GDP格式化输出、99乘法表
查看>>