Ned*_*Ned 5 multithreading objective-c autorelease
在开发人员文档中,它说:
如果您的应用程序或线程长寿并且可能生成大量自动释放的对象,则应定期排空并创建自动释放池(如主线程上的Application Kit); 否则,自动释放的对象会累积,并且您的内存占用会增加.但是,如果您的分离线程没有进行Cocoa调用,则不需要创建自动释放池.
我想知道最好的办法是什么.我认为有几种方法可行,但不知道哪种方法是"最好的".我目前有一个启动线程的方法,并让它等待执行操作:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
我能想到的选择是:
1)在while中添加一个计数器(accessoryThreadIsRunning),这样每50或100次它将耗尽自动释放池并创建一个新的.
2)每次我在该线程中执行一个方法(使用performSelector:onThread :),我可以创建一个自动释放池,然后在方法结束时释放它.
3)制作一个计时器,以便排空一个池,然后定期创建.
我认为选项1是最好的,但想知道我应该采用不同的方式做到这一点.谢谢!
我将从非常简单的开始,只需在每次循环时创建/排出池。
如果它在性能分析过程中显示为瓶颈,请修复它。
保持简单,直到分析表明需要复杂性为止。
我刚刚重新阅读了你的问题,并意识到我的回答完全是愚蠢的。如果您正在运行运行循环,它应该自动为您管理自动释放池;它应该在循环的顶部创建一个池,并在每次循环结束时将其排空。
如果您在运行循环之外还有其他事情发生,您只需要自己循环一个。是这样吗?
无论如何,是的,模式是:
while(...) {
... create pool ...
... do stuff ...
... drain pool ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5428 次 |
| 最近记录: |