gpt4 book ai didi

objective-c - macOS:setNeedsDisplayInRect 导致的内存消耗

转载 作者:行者123 更新时间:2023-12-03 17:48:15 28 4
gpt4 key购买 nike

我的 macOS 应用程序存在严重的内存泄漏问题。经过大量调试,我似乎找到了原因,尽管我仍然不太明白。

应用程序将像素绘制到内部缓冲区,然后在 NSView 子类的 drawRect 方法中实际将其绘制到屏幕上。重绘由 [self setNeedsDisplayInRect:rect] 触发。

几个小时后,程序消耗了数 GB 的 RAM。然而,当我将 setNeedsDisplayInRect 的调用放在一个循环中来调用它时,比如说,每当我想重新绘制时,调用它 10,000 次而不是一次,内存消耗在短短几分钟内就会上升到千兆字节。

为了确保 drawRect 方法中的内存不会泄漏,我删除了整个主体,只留下一个空方法。

据我从文档中了解到,给予 setNeedsDisplayInRect 的所有矩形都会被存储,直到在事件循环的下一次运行中实际处理重绘为止。因此,当我调用它 10,000 次时,我预计内存消耗会更高,但我不会期望它一直持续上升 - 我预计在事件循环的一次迭代后所有存储的矩形都会被清理。

那么,为什么调用setNeedsDisplayInRect时内存量不断上升呢?我知道每秒调用它 10,000 次并不完全是正常使用,但内存使用量在正常情况下也会不断上升,尽管速度慢很多。

代码摘录:

- (void)drawRect:(NSRect)dirtyRect {
// Currently, nothing happening
}

// My own method, that gets called from elsewhere.
- (void) drawToScreen:(int) x : (int) y : (int)w :(int)h :(int *)data
{
int rectYPos = MAX(height - y - h, 0);
NSRect rect = NSMakeRect(x, rectYPos, w, h);
for(int i = 0; i < 10000; i++)
{
[self setNeedsDisplayInRect:rect];
}
}

最佳答案

如果您从辅助/后台线程调用此函数,您可能需要查看(来自 Apple 的文档):

“如果应用程序的辅助线程想要在主线程上重绘 View 的某些部分,则不得使用诸如 display、setNeedsDisplay:、setNeedsDisplayInRect: 或 setViewsNeedDisplay: 之类的方法来执行此操作。相反,它应该向主线程发送消息或使用 PerformSelectorOnMainThread:withObject:waitUntilDone: 方法调用这些方法。”

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

关于objective-c - macOS:setNeedsDisplayInRect 导致的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42270636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com