2015-01-31 3 views
0

주기 내에서이 메서드를 호출하려고하는데 최대 두세 번 반복 할 때까지 모든 것이 올바르게 작동합니다. 그런 다음주기가 끝난 후 반환되는 메모리가 1GB 이상 필요합니다. 어떻게 그 손실을 피하기 위해?주기 내 NSReadPixel을 사용하는 동안 메모리 누수가 발생했습니다.

- (char) getPixelColorAtLocation: (CGPoint)point { 

NSImage *image = sampleImageView.image; 
[image lockFocus]; 
NSColor *aColor = NSReadPixel(point); 
[image unlockFocus]; 

return 'r’; // just for debugging 
//some code here 
} 

아, 메서드 밖에서 -lockFocus를 움직이는 것은 정말 쉽고 큰 감사입니다!

답변

2

-lockFocus을 호출하면 이미지의 스냅 샷이 만들어집니다. 가볍게 할 일이 아닙니다. 단단한 루프 바깥 쪽에서 초점을 잠그고 잠금 해제하면 괜찮을 것입니다.

다른 방법으로 이미지 밖으로 픽셀 데이터를 읽을 수 있습니다. 불행하게도 그것이 그렇게되어야한다고 생각되는 것보다 조금 더 어렵다는 것이 밝혀졌습니다. 그것이 나 였다면 미리 할당 된 특정 배킹 메모리로 CGBitmapContext를 만들고 그 이미지를 그린 다음 컨텍스트를 만들 때 지정한 배킹 메모리 포맷에 대한 지식을 기반으로 픽셀 데이터를 읽습니다. 불가능하지는 않지만 NSReadPixel과 같이 간단하고 간단합니다.

나에게 발생합니다 ... @autoreleasepool에 몸을 감쌀 수 있습니다. 이 거대한 메모리 증가를 방지 할 수 있지만, 방법을 호출 할 때마다 미래의 독자 등 이미지의 새 스냅 샷을 만들려고하기 때문에 성능이 을하지 않는다, 심해을 될 것입니다, 그러나 완전성을 위해 메모리 부분을 해결할 것입니다.