作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我在 NSThread
中运行一些代码,它在循环中创建一大堆 NSImage
。每个图像的一小部分被绘制到另一个 NSImage
中,然后线程退出。
所以,类似
NSImage *outputImage = [[NSImage alloc] initWithSize:size];
[outputImage lockFocus];
while(1000 times)
NSImage* image = [[NSImage alloc] initWithSize:size];
... image is processed ...
[image drawInRect: ... fromRect: ... ]
[outputImage unlockFocus];
一旦完成,线程使用performSelectorOnMainThread
将创建的NSImage发送回主线程以将其放置在 View 中。
这一切都很好,最终的图像完全符合我的预期。然而,在循环期间,应用程序的内存使用量呈线性上升 - 就好像每个 NSImage 直到稍后才会释放一样。我的理论是,drawInRect 调用正在某处进行管道传输,直到稍后才真正执行。它是否正确?如果是这样我该如何预防?如果我现在让循环计数器太大,我的应用程序将会崩溃,我想避免这种情况。
我尝试将焦点的锁定和解锁移动到循环中,但这没有什么区别。
我已经确认,如果仅取出 drawInRect
调用,则线程生命周期内的内存使用量(或多或少)是持平的。只有当我调用电话时,内存才会上升。
我(显然?)在这个项目中使用 ARC,并且它在 OSX10.9 中运行。
最佳答案
听起来您的 NSImages 在某个时候被添加到自动释放池中。在泳池排空之前,它们通常不会被冲走。
在这种情况下,您想要创建自己的自动释放池:
NSImage *outputImage = [[NSImage alloc] initWithSize:size];
[outputImage lockFocus];
while(1000 times) {
@autoreleasepool {
NSImage* image = [[NSImage alloc] initWithSize:size];
... image is processed ...
[image drawInRect: ... fromRect: ... ]
}
}
[outputImage unlockFocus];
这会创建一个子池,每次传递都会耗尽该子池,因此您不会积累大量图像。
关于macos - drawInRect 保留 NSImage 直到将来的某个时刻?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21271009/
我是一名优秀的程序员,十分优秀!