以下线程解释了如何查找当前包含鼠标光标的屏幕:
http://www.cocoabuilder.com/archive/cocoa/104529-current-mouse-screen.html
- (NSScreen *)currentScreenForPointUsingEnumeration:(NSPoint)aPoint
{
NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator];
NSScreen *screen;
while ((screen = [screenEnumerator nextObject]) && !NSMouseInRect(aPoint, screen.frame, NO));
return screen;
}
我在每次鼠标移动时都会运行它。
不幸的是,使用 Xcode 工具工具中的"分配"功能,上面的代码显示了许多NSFastEnumeration
分配。
分析仪中没有出现"泄漏",但分配计数不断上升,永远不会减少。该应用程序的整体内存使用量也继续上升。
使用 for(...)
循环的类似函数没有同样的问题。
我能做些什么来提高这里的性能吗?还是我不应该担心的事情?
编辑:
顺便说一句,尝试[[[NSScreen screens] objectEnumerator] autorelease]
会使应用程序崩溃并完全锁定我的鼠标。无法单击或以其他方式找出退出应用程序或 Xcode 的方法。需要重新启动 OS X。所以不要那样做。
我能做些什么来提高这里的性能吗?
我不确定你为什么认为存在性能问题。 分析仪没有泄漏,所以除非它是有缺陷的(不幸的是,现在并非不可能),否则可能没有泄漏。
如果将代码包装在自动发布池中,则应解除分配NSFastEnumerations
。
你可以尝试两件事;不确定哪件事会有所帮助,或者它们是否会有所帮助。
一、使用实际的快速枚举语法:
for( NSScreen * screen in [NSScreen screens] ){
if( NSMouseInRect(aPoint, screen.frame, NO) ){
return screen;
}
}
或者将其包装在您自己的自动发布池中,以帮助尽快解除分配创建的数组和枚举器对象。
NSScreen *screen = nil;
@autoreleasepool{
NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator];
while ((screen = [screenEnumerator nextObject]) && !NSMouseInRect(aPoint, screen.frame, NO));
[screen retain]; // Ensure screen sticks around past return; only under MRR
}
return [screen autorelease];
您可以尝试使用块,和/或将其包装在自动释放池中,例如:
__block NSScreen *retVal = nil;
[[NSScreen screens] enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(Screen *scrn, NSUInteger idx, BOOL *stop) {
if (NSMouseInRect(aPoint, scrn.frame, NO)) {
retVal = scrn;
*stop = YES;
}];
return retVal;