在循环中使用 NSReadPixel 时内存泄漏
Memory leaks while using NSReadPixel in a cycle
我试图在一个循环中调用此方法并且一切正常,直到我将迭代次数增加到几千次。那么一个循环结束后returns需要1GB多的内存。如何避免这种损失?
- (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
中。这将防止巨大的内存增长,但性能将是 糟糕的 因为每次调用该方法都会为图片等。对于未来的读者,不要这样做,但为了完整性,它会解决内存部分问题。
我试图在一个循环中调用此方法并且一切正常,直到我将迭代次数增加到几千次。那么一个循环结束后returns需要1GB多的内存。如何避免这种损失?
- (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
中。这将防止巨大的内存增长,但性能将是 糟糕的 因为每次调用该方法都会为图片等。对于未来的读者,不要这样做,但为了完整性,它会解决内存部分问题。