我正在尝试实现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 运行时假装 GCD 对象实际上是 Obj-C 对象。当使用 ARC(自动引用计数(时,ARC 还将为您管理 GCD 对象的生命周期。
假设两者都适用于您的代码,GCD 对象被视为 Obj-C 对象并启用了 ARC,则一旦方法完成-doingSomething:
,您的调度源就会被销毁,因为此方法具有对源的唯一引用,并且此引用刚刚超出范围。