我试图在一个循环中调用此方法,一切正常,直到我将迭代次数增加到几万次。然后,在循环结束后返回需要超过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非常简单,非常感谢!
答案 0 :(得分:2)
调用-lockFocus
会导致拍摄图像的快照。这不是轻松的事情。将焦点的锁定和解锁移动到紧密循环之外,你应该没问题。
或者,你可以找出另一种从图像中读取像素数据的方法。不幸的是,事实证明这比看起来应该更难。如果是我,我将使用特定的预分配后备内存创建一个CGBitmapContext,将图像绘制到该内容中,然后根据您在创建上下文时指定的后备内存格式的知识读取像素数据。这并非不可能,但它远没有调用NSReadPixel
那么简单。
它发生在我身上......你可以也将你方法的主体包裹在@autoreleasepool
中。这可以防止巨大的内存增长,但性能将是 abysmal ,因为每次调用该方法都会创建一个新的图像快照等。读者, 不要这样做 ,但为了完整起见,它将解决问题的内存部分。