繁体   English   中英

Objective-C:dispatch_source_t DISPATCH_SOURCE_TYPE_DATA_ADD从未执行

[英]Objective-C: dispatch_source_t DISPATCH_SOURCE_TYPE_DATA_ADD never executed

我正在尝试实现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));
        });

你们谁知道为什么我的那部分代码从未执行过?

非常感谢您的帮助。

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

调度源实际上不是对象,它们是不透明的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:完成后,您的调度源将被销毁,因为该方法仅具有对源的引用,而该引用仅超出范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM