2009-11-14 3 views
0

CGImageRef에서 빌드 된 NSBitmapImageRep 내부의 픽셀 데이터를 분석하는 방법이 있습니다. 여기에 관련 코드 :NSBitmapImageRep의 메모리 누수가 많습니다.

CGImageRef ref; 
// omitted code for initializing ref 
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:ref]; 
uint32* bitmapPixels = (uint32*) [bitmapRep bitmapData]; 
// do stuff with bitmapPixels 
[bitmapRep release]; 
CGImageRelease(ref); 

내가 제대로 CGImageRef 및 NSBitmapImageRep을 발표하고있어 알고는 있지만, -bitmapData에 대한 호출에 대한 2메가바이트에게가 호출 될 때마다 누수, 내가 제대로 해제하는 방법을 모른다 그것. 어떤 아이디어?

업데이트 : 중요한 점을 하나 추가하는 것을 잊어 버렸습니다. 전체 화면 응용 프로그램이 실행 중일 때만 메모리가 누출됩니다. 정기적 인 사용을 위해 메모리가 정상적으로 릴리스됩니다.

+1

참조를 간략히 살펴보면 -bitMapData가 bitmapRep 객체 내의 데이터에 대한 포인터를 반환하기 때문에이를 해제 할 필요가 없음을 나타냅니다. 가비지 수집을 켜고 그 후에 무슨 일이 일어날 수 있습니까? 그것은 당신에게 단서를 줄지도 모릅니다. –

+0

@Tony Ken의 솔루션은 일단 데이터가 완성되면 데이터를 공개하는 것으로 보입니다. 수영장이 없으면 Mac은 원하는 때에 언제든지 데이터를 공개하는 것처럼 보입니다. – pop850

답변

0

비트 맵 데이터는 CGImage 또는 NSBitmapImageRep에 의해 소유되어야합니다 (또는 후자에 의해 자동 렌더링 된 NSL 객체에 복사 됨). 따라서 어떤 객체가 소유 (또는 복사) 하든지 객체를 릴리스해야합니다.

힙/인스트루먼트가 상반되는 결과가 있습니까?

3

루프를 반복하고 있습니까? 그렇다면 자동 복구 풀을 만들어 메모리를 적절한시기에 정리해야합니다. autorelease pools을 참조하십시오.

+0

닉이 물었던 것과 비슷한 문제가 있었는데,이 솔루션은 완벽했습니다. 감사! – pop850

+0

한 번에 200 + 5MB + CIImages 및 NSBitmapImageReps 이미지를 루핑했는데 메모리 사용량이 2 ~ 3GB 정도가 될 것입니다 (플러스 시스템은 꽤 느려질 것입니다). 루프 주위에 @autoreleasepool {}을 추가하면 피크 메모리 사용량이 ~ 180MB로 줄어들었고 일괄 처리가 1-2 분이 아닌 몇 초가 걸리게되었습니다! – geerlingguy