gpt4 book ai didi

objective-c - 使用 Cocoa 在 Objective-C 的事件处理程序中移除本地事件监视器的竞争条件

转载 作者:行者123 更新时间:2023-12-03 17:47:16 25 4
gpt4 key购买 nike

我正在使用 Cocoa 框架在 Objective-C 中创建本地事件监视器,想知道这是否会引入竞争条件:

id monitor = [NSEvent addLocalMonitorForEventsMatchingMask:
(NSEventMaskLeftMouseDown | NSEventMaskRightMouseDown | NSEventMaskOtherMouseDown)
handler:^(NSEvent* event)
{
[NSEvent removeMonitor:monitor];
}];

最佳答案

您的代码无法编译,因为该 block 不返回值,所以也许您已经将其简化太多而无法发布。

接下来, block 内 monitor 的值将始终为 nil,因为它的值在之前 block 构造过程中被复制addLocalMonitorForEventsMatchingMask 返回,并为 monitor 分配一个值。

您可以通过将 monitor 声明为 __block 来解决最后一个问题,从而捕获变量而不是其值,但这可以让您:

您已经有了一个引用周期。 addLocalMonitorForEventsMatchingMask 返回的不透明监视器对象包含对您的 block 的引用,并且您的 block 包含对监视器对象的引用。这不会影响监控的操作或删除,它只是意味着监控对象和 block 对象永远不会被收集。您可以在执行 removeMonitor 时通过在 block 中 niling monitor 来解决此问题。

这引出了你的最后一个问题,是否存在竞争条件?大概您的意思是事件系统为一个事件调用监视器并尝试在下一个事件上调用它。我不知道我们是否可以肯定地说,但是 removeMonitor 的文档没有提到要采取的任何预防措施,并且初始事件处理是通过“队列”完成的,表明系统不会开始处理后续事件,直到它至少将当前事件分派(dispatch)到您的应用程序。这确实强烈表明竞争条件在这里不是问题。

但请注意,文档,甚至是 Swift 版本,都使用术语“垃圾收集”,尽管 ARC 是 GC 的一种类型,但 Apple 倾向于为长期弃用的 ARC 之前(和 Swift 之前)垃圾收集器保留该术语- 表明文档已经很久没有被修改过(用计算机术语来说)。也许其他人会对此提供明确的答案。

HTH

关于objective-c - 使用 Cocoa 在 Objective-C 的事件处理程序中移除本地事件监视器的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618152/

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