Objective-C:dispatch_source_t DISPATCH_SOURCE_TYPE_DATA_ADD从未执行过

问题描述 投票:0回答:1

我正在尝试实施dispatch_source_t。这是我的实现:

-(void)doingSomething:(NSString*)someValue
{

    dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());

    dispatch_source_set_event_handler(source, ^{

        NSLog(@"here %@", someValue);
        NSLog(@"监听函数:%lu",dispatch_source_get_data(source));
    });

    dispatch_resume(source);
dispatch_source_merge_data(source, 1);
    }

但是这部分实现从未执行过:

dispatch_source_set_event_handler(source, ^{

            NSLog(@"here %@", someValue);
            NSLog(@"监听函数:%lu",dispatch_source_get_data(source));
        });

你们中的任何人都知道为什么我的代码部分永远不会被执行?

我真的很感谢你的帮助。

ios objective-c iphone xcode8 grand-central-dispatch
1个回答
0
投票

您不会使调度源保持活动状态。

Dispatch源实际上没有对象,它们是不透明的C数据结构。创建调度源时,必须在完成调用后调用dispatch_release(...),以使系统释放与之关联的内存。然而,调度源是引用计数,所以你也可以调用dispatch_retain(...)来增加它们的引用计数,dispatch_release(...)再次减少它,一旦它达到0,对象就会被破坏。不用说,新创建的调度源的保留计数为1。

但是,在Objective-C代码中使用调度源时,可以通过设置默认启用的编译器标志OS_OBJECT_USE_OBJC,使Obj-C运行时假装GCB对象实际上是Obj-C对象。当使用ARC(自动参考计数)时,ARC还将为您管理GCD对象的生命周期。

假设两者都适用于您的代码,GCD对象被视为Obj-C对象并且ARC已启用,一旦方法-doingSomething:完成,您的调度源就会被销毁,因为此方法只有对源的引用,此引用刚刚消失范围。

© www.soinside.com 2019 - 2024. All rights reserved.