2015-01-31 122 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。这将防止贪吃蛇增长,但性能将是糟糕,因为该方法每次调用将会使图像等。对于未来的读者的新快照,不这样做,但为了完整性,它将解决内存部分问题。