NSEvent addLocalMonitorForEventsMatchingMask 内存泄漏
NSEvent addLocalMonitorForEventsMatchingMask Memory Leak
这里又出现了另一个内存泄漏问题。我有一个 NSStatusItem,我试图捕获鼠标点击并做出反应。以下代码会导致 Instruments 报告泄漏,删除此代码会导致 Instruments 报告无泄漏:
[NSEvent addLocalMonitorForEventsMatchingMask:(NSLeftMouseDown | NSLeftMouseDownMask | NSRightMouseDown | NSRightMouseDownMask)
handler:^NSEvent *(NSEvent *event)
{
if (event.window == self.statusItem.button.window)
{
[self statusItemClicked:self.statusItem.button];
return nil;
}
return event;
}];
非常感谢有关如何正确实施的建议!谢谢!
addLocalMonitorForEventsMatchingMask:handler:
方法returns监控对象。当您不再需要它并希望系统停止向它发送事件时,您可以将对象传递给 removeMonitor:
。
事件监视器创建一个涉及自身的保留循环。即使您不保留对监视器的引用,这也会使监视器保持活动状态。此保留周期在 Instruments 中显示为泄漏对象。
如果您想防止泄漏出现在 Instruments 中,请将监视器(由 addLocalMonitor...
返回)存储在某个地方,例如在您的应用委托的实例变量中。
这里又出现了另一个内存泄漏问题。我有一个 NSStatusItem,我试图捕获鼠标点击并做出反应。以下代码会导致 Instruments 报告泄漏,删除此代码会导致 Instruments 报告无泄漏:
[NSEvent addLocalMonitorForEventsMatchingMask:(NSLeftMouseDown | NSLeftMouseDownMask | NSRightMouseDown | NSRightMouseDownMask)
handler:^NSEvent *(NSEvent *event)
{
if (event.window == self.statusItem.button.window)
{
[self statusItemClicked:self.statusItem.button];
return nil;
}
return event;
}];
非常感谢有关如何正确实施的建议!谢谢!
addLocalMonitorForEventsMatchingMask:handler:
方法returns监控对象。当您不再需要它并希望系统停止向它发送事件时,您可以将对象传递给 removeMonitor:
。
事件监视器创建一个涉及自身的保留循环。即使您不保留对监视器的引用,这也会使监视器保持活动状态。此保留周期在 Instruments 中显示为泄漏对象。
如果您想防止泄漏出现在 Instruments 中,请将监视器(由 addLocalMonitor...
返回)存储在某个地方,例如在您的应用委托的实例变量中。