2015-01-31 121 views
0

我試圖在一個循環中調用此方法,並且一切正常,直到我將迭代次數增加到幾千。然後,在一個週期結束後,將返回超過1 GB的內存。如何避免這種損失?在一個循環中使用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。這將防止貪吃蛇增長,但性能將是糟糕,因爲該方法每次調用將會使圖像等。對於未來的讀者的新快照,不這樣做,但爲了完整性,它將解決內存部分問題。