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

あなたが試すことができる2つのこと。どちらが役立つか、またはまったく役立つかどうかはわかりません。

1つは、実際の高速列挙構文を使用することです。

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 に答える
0

ブロックを使用してみてください、および/または自動解放プールにラップすることができます。

__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 に答える