gpt4 book ai didi

objective-c - 在长时间运行的后台线程上定期耗尽自动释放池的最佳方法?

转载 作者:太空狗 更新时间:2023-10-30 03:51:35 25 4
gpt4 key购买 nike

在开发者文档中,它说:

If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should periodically drain and create autorelease pools (like the Application Kit does on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If, however, your detached thread does not make Cocoa calls, you do not need to create an autorelease pool.

我想知道最好的方法是什么。我有几种我认为可行的方法,但不知道哪种是“最好的”。我目前有一个启动线程并使其等待操作执行的方法:

- (void)startThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

accessoryRunLoop = [NSRunLoop currentRunLoop];

//Add a dummy port to avoid exiting the thread due to no ports being found
[accessoryRunLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

while(accessoryThreadIsRunning)
{
//Keep the thread running until accessoryTheadIsRunning == NO
[accessoryRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

[pool release];
}

我能想到的选择是:

1) 在 while(accessoryThreadIsRunning) 中添加一个计数器,这样每 50 或 100 次它就会耗尽自动释放池并创建一个新的。

2) 每次我在该线程中执行一个方法时(使用 performSelector: onThread:),我可以创建一个自动释放池,然后在方法结束时释放它。

3) 制作一个计时器,以便池被排空然后定期创建。

我认为选项 1 是最好的,但我想知道是否有其他方法可以做到这一点。谢谢!

最佳答案

我会从非常简单的开始,在每次循环时创建/清空池。

如果它在性能分析期间显示为瓶颈,请修复它。

保持简单,直到分析表明需要复杂性。


我刚刚重新阅读了您的问题,并意识到我的回答中有些东西完全是愚蠢的。如果您正在运行一个运行循环,它应该为您自动管理一个自动释放池;它应该在循环的顶部创建一个池,并在每次循环结束时将其排出。

如果在 runloop 之外还有其他事情发生,您只需要自己循环一个。是这样吗?

无论如何,是的,模式是:

 while(...) {
... create pool ...
... do stuff ...
... drain pool ...
}

关于objective-c - 在长时间运行的后台线程上定期耗尽自动释放池的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807035/

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