2

以下线程解释了如何找到当前包含鼠标光标的屏幕:

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 的 Instruments 工具中的“分配”功能,上面的代码显示了许多NSFastEnumeration.

分析器中没有出现“泄漏”,但分配计数不断增加并且从未减少。该应用程序的整体内存使用量也继续上升。

使用for(...)循环的类似函数没有相同的问题。

我能做些什么来提高这里的性能吗?还是我不应该担心的事情?

编辑:

顺便说一句,尝试[[[NSScreen screens] objectEnumerator] autorelease]使应用程序崩溃并完全锁定我的鼠标。无法单击或以其他方式找出退出应用程序或 Xcode 的方法。需要重新启动 OS X。所以不要那样做。

4

3 回答 3

1

我能做些什么来提高这里的性能吗?

我不确定您为什么认为存在性能问题。分析仪显示没有泄漏,所以除非它是错误的(不幸的是,这些天并非不可能),否则可能没有泄漏。

如果您将代码包装在自动释放池中,则NSFastEnumerations应该被释放。

于 2012-04-16T08:55:04.977 回答
0

You could try using blocks, and/or wrap it up in autorelease pool eg :

__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;
于 2012-04-16T06:15:02.093 回答
0

您可以尝试两件事;不确定哪个会有所帮助,或者他们是否会有所帮助。

一、使用实际的快速枚举语法:

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];
于 2012-04-16T06:08:52.253 回答