在一个周期中使用 NSReadPixel 时内存泄漏



我正在尝试在一个循环中调用此方法,并且一切正常,直到我将迭代次数增加到几千次。然后,在一个周期结束后返回的内存需要超过 1 GB 的内存。如何避免这种损失?

- (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 移到方法之外真的很容易,非常感谢!

调用-lockFocus会导致创建映像的快照。这不是一件轻而易举的事情。将焦点的锁定和解锁移到紧密循环之外,您应该没问题。

或者,您可以找到另一种从图像中读取像素数据的方法。不幸的是,事实证明,这比看起来应该的要难一些。如果是我,我会创建一个带有特定的、预分配的支持内存的 CGBitmapContext,将图像绘制到其中,然后根据您对创建上下文时指定的后备内存格式的了解读出像素数据。这并非不可能,但远没有打电话NSReadPixel那么简单。

它发生在我身上...您也可以将方法的主体包装在@autoreleasepool中。这将防止巨大的内存增长,但性能将非常糟糕,因为对该方法的每次调用都会创建图像的新快照等。对于未来的读者,不要这样做,但为了完整起见,它将解决问题的内存部分。

最新更新