0

所以我有一些代码运行在NSThread一个循环中,它创建了一大堆NSImages。每个图像的一小部分被绘制到另一个图像中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 发送回主线程以将其放置在视图中。

这一切都很好,最终的图像完全符合我的预期。然而,在循环过程中,应用程序的内存使用量呈线性上升 - 就好像每个NSImage都在稍后的某个时间才被释放。我的理论是,这些drawInRect调用正在某个地方进行流水线处理,直到稍后才真正执行。这个对吗?如果是这样,我该如何预防?如果我现在让我的循环计数器太大,我的应用程序将会崩溃,我想避免这种情况。

我已经尝试将焦点的锁定和解锁移动到循环中,但这没有任何区别。

我已经确认,如果我只进行drawInRect调用,那么在线程的整个生命周期内,内存使用量(或多或少)是持平的。只有当我拨打电话时,记忆才会攀升。

我(显然?)在这个项目中使用 ARC,它在 OSX10.9 中运行。

4

1 回答 1

2

听起来您的 NSImage 正在某个时候被添加到自动释放池中。在池排空之前,它们通常不会被冲洗掉。

在这种情况下,您想创建自己的自动释放池:

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];

这会创建一个子池,每次传递都会耗尽,因此您不会有大量的图像堆积。

于 2014-01-22T00:17:47.867 回答