2010-11-23 1 views
1

지난 며칠 동안 objective-c 프로그램에서 메모리 누수를 디버깅하려고 시도 했었고 몇 가지 기본적인 샘플 코드로 몇 가지 아이디어를 테스트 해 보았습니다. 나에게 버그 인 것처럼 보이지만 맥 세계에서 개발할 때 더 많은 지식을 가진 사람들로부터 의견을 얻고 싶었다.NSScreen이 GarbageCollection 아래로 누출되었습니다.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSRect desktopRect = NSZeroRect; 

NSArray* screens = [[NSScreen screens] autorelease]; 
int x = 0; 
for (x = 0; x < [screens count]; x++) 
{ 
    NSScreen *screen = [screens objectAtIndex:x]; 
} 

[pool drain]; 

이 코드는 내가 프로세스를 종료 할 때까지 계속 while 루프에서 전화하고 방법 안에 살고 :

나는 다음과 같은 코드가 있습니다. (단순한 테스트에 불과하다는 것을 기억하십시오.)

가비지 수집을 구현하지 않을 때,이 루프를 실행하고 Instruments에서 할당을 관찰하면 모든 것이 완벽하게 작동합니다. 할당의 총 수는 일정하게 유지되고 NSScreens가있는 모든 것이 정리되고 해제됩니다.

[가비지 수집]을 활성화하면 [NSScreen 스크린]에 대한 호출이 코어 그래픽 객체를 공개하지 않음으로써 미친 듯이 누출되기 시작합니다.

다른 포럼에서 몇 년 전 Core Graphics가 Garbage Collection 아래에서 매우 새어 난다는 이야기를 들었습니다. 그게 여기에 해당되는지 궁금하네요.

커뮤니티의 의견이 있으십니까?

+0

왜 [[NSScreen screens]]을 자동 올리기를 하시겠습니까? 당신은 그것을 소유하지 않습니다. –

+0

Peter, 내가 가지고 있었던 문제는 콜에 의해 생성 된 배경 코어 그래픽 오브젝트가 결코 공개되지 않았다는 것입니다. 위의 예에서 autorelease가 아무 것도하지 않았다는 것을 인정합니다. 내 CG 요소가 공개 될 수 있다는 희망이되었습니다. –

+0

그건 중요하지 않습니다. 자신이 소유하지 않은 것을 공개해서는 안됩니다. "도움을 받았다"고해도, 여전히 잘못되었을 것이고, 애플이 버그를 고칠 때 충돌을 일으켰을 것이다. 또한 GC 아래에서 실행 중이므로 보관, 릴리스 및 자동 릴리스 메시지가 아무 것도 통과하지 못하므로 런타임에서 완전히 무시합니다. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/ –

답변

1

좋아, 나는 사지에 나가서 사과 프리 파트의 버그라고 말하지만, 나는 무료 전화 브리지 마법을 사용하여 해결책을 찾았다. 내가 할 코드를 수정 :

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSRect desktopRect = NSZeroRect; 

CFArrayRef screens = CFMakeCollectable((CFArrayRef)[NSScreen screens]); 
int x = 0; 
for (x = 0; x < [screens count]; x++) 
{ 
    NSScreen *screen = (NSScreen*)CFArrayGetValueAtIndex(screens,x); 
} 

[pool drain]; 

무료 전화 - 브리지 배열에 CFMakeCollectable를 호출함으로써, 가비지 컬렉션을 사용할 때 배경 코어 그래픽 객체가 제대로 정리할 수있었습니다.

이것은 분명히 애플이 Core Graphics를 감싸는 가비지 콜렉션과 코코아 오브젝트로 더 많은 작업을해야한다고 생각하게 만듭니다.

+0

또는 NSMakeCollectable을 사용하고 NSArray로 처리하십시오. 그러나 Apple이 버그를 수정하면 이것이 안전한지 여부는 알 수 없습니다. RadarWeb의 버그를보고하고 지금은 누출시켜 어레이를 캐쉬에 저장하는 것이 더 좋을 수도 있습니다. https://bugreport.apple.com/ –

관련 문제