2012-04-16 2 views
2

다음 스레드는 현재 마우스 커서가 들어있는 화면을 찾는 방법을 설명 :이 모든 마우스 움직임에서 실행 한NSArray objectEnumerator의 메모리 누수?

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을 다시 시작해야합니다. 그러지 마라.

+0

"Xcode의 분석 도구"는 Instruments를 의미합니까? Instruments는 Clang 정적 분석기와 매우 다르며 런타임에 아직 실행되지 않았기 때문에 정적 분석기는 런타임에 축적되는 개인 구현 세부 개체를 감지 할 수 없습니다. –

+0

오른쪽, Instruments의 "Allocations"도구. 나는 그 질문을 편집 할 것이다. – cksubs

+1

'objectEnumerator'는 소유하고있는 객체를 반환하지 않습니다. 당신은 그 이름으로 이것을 말할 수 있습니다. 따라서, 그 객체에'autorelease '를 보내는 것은 잘못된 것이다. –

답변

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]; 
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; 
+0

예, 업데이트 된 조건. – mit3z

1

있습니까?

성능 문제가 있다고 생각하는 이유가 확실하지 않습니다. 분석기는 누수가 없음을 보여 주므로 버그가 없다면 (요즘에는 불행히도 불가능하지는 않습니다) 누수가 없을 것입니다.

자동 릴리스 풀에 코드를 래핑하는 경우 NSFastEnumerations이 할당 해제되어야합니다.

+0

질문 : "... 할당 횟수가 계속 증가하고 결코 감소하지 않습니다."이것은 엄격한 의미에서 "누출"이 아니지만 메모리 사용 문제입니다. [악기를 사용하여 그것을 탐지 할 수 있습니다] (http : //www.friday.co.kr/bbum/2010/10/17/leak-using-heapshot-analysis-to-find-desirable-memory-growth /)에 대한 질문에 대해 질문자가 한 것입니다 (그가 실수로 그것을 "분석기"라고 부르기는하지만). –