- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 中 nil
ing monitor
来解决此问题。
这引出了你的最后一个问题,是否存在竞争条件?大概您的意思是事件系统为一个事件调用监视器并尝试在下一个事件上调用它。我不知道我们是否可以肯定地说,但是 removeMonitor
的文档没有提到要采取的任何预防措施,并且初始事件处理是通过“队列”完成的,表明系统不会开始处理后续事件,直到它至少将当前事件分派(dispatch)到您的应用程序。这确实强烈表明竞争条件在这里不是问题。
但请注意,文档,甚至是 Swift 版本,都使用术语“垃圾收集”,尽管 ARC 是 GC 的一种类型,但 Apple 倾向于为长期弃用的 ARC 之前(和 Swift 之前)垃圾收集器保留该术语- 表明文档已经很久没有被修改过(用计算机术语来说)。也许其他人会对此提供明确的答案。
HTH
关于objective-c - 使用 Cocoa 在 Objective-C 的事件处理程序中移除本地事件监视器的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618152/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!