gpt4 book ai didi

objective-c - 正确处理 Grand Central Dispatch I/O channel

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:42 24 4
gpt4 key购买 nike

我对如何在完成 Grand Central Dispatch I/O channel 后正确处理它感到困惑。以下(简化的)示例导致某些专用调度队列崩溃,并显示消息:LIBDISPATCH 客户端中的错误:对象的过度恢复:

- (void)beginReading {
dispatch_io_t channel;
channel = dispatch_io_create_with_path(DISPATCH_IO_RANDOM,
"/Path/To/Some/File",
O_RDONLY,
0 /*mode*/,
someQueue,
^(int errorCode) {
// Cleanup handler; executed once channel is closed.
// (Or fails to open.)
});
// Schedule the read operation
dispatch_io_read(channel, 0, SIZE_MAX, someQueue, ^(bool done, dispatch_data_t data, int errorCode) {
NSError *error = (errorCode!=0) ? [NSError errorWithDomain:NSPOSIXErrorDomain code:errorCode userInfo:nil] : nil;
[self didReadChunk:data isEOF:done error:error];
});

// No more read operations to come, so we can safely close the channel.
// (Or can we?)
dispatch_io_close(channel, 0);

// We don't need a reference to the channel anymore
dispatch_release(channel);
}

我猜测 dispatch_io_close() 安排了一些异步操作来关闭 channel ,并且在该操作完成执行之前,您不能调用 dispatch_release()在 channel 上,否则会发生不好的事情。但这将是相当令人惊讶的:其他 GCD 异步函数,例如 dispatch_async(),没有此限制。此外,dispatch_io_close() 调用似乎并不是绝对必要的,因为 libdispatch 似乎在 channel 上最后一次调用 dispatch_release() 时关闭了文件。

从这里可以看出,如果您调用 dispatch_io_close,您必须注意在清理处理程序运行之前不要释放 channel 。这太烦人了,我想知道这是否是一个错误。还是我遗漏了什么?

最佳答案

事实证明这是一个错误(雷达#10246694)。进一步的实验似乎表明它只影响基于路径的调度 channel ,即那些使用 dispatch_io_create_with_path() 创建的 channel ,而不是 dispatch_io_create()

关于objective-c - 正确处理 Grand Central Dispatch I/O channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com