关于iPhone上的多个线程

时间:2011-03-27 17:55:08

标签: iphone nsautoreleasepool

我有一个问题。我的案例研究是我有两个大的SQLite数据库,我想使用线程(同时意味着2个进程)。它运作得好吗?我写了以下代码:

NSAutoreleasePool *dbPool;

dbPool = [[NSAutoreleasePool alloc] init];

/* All Database work is performed here */

[dbPool release];

请指导我。我这样做是否正确?我应该使用游泳池来排水还是释放?

这样就是使用并发进程,这意味着它与多任务处理的行为相同?

提前致谢!

2 个答案:

答案 0 :(得分:1)

是的,你做对了。每个新线程都需要自己的自动释放池。

关于你关于游泳池释放/排水的问题,推荐是排水消息。

sqlite数据库是什么意思?你怎么访问它?如果您通过CoreData访问它,您将继续关注您的记忆:

  • 每个线程需要一个NSManagedObjectContext,
  • 不要将NSManagedObjects传递给另一个线程,只需传递对象ID
  • 在将对象ID传递给另一个线程之前,将其保存在传递它之前修改/创建的线程中。

有更多规则,但这些是基本规则。

多任务处理意味着您可以一次运行更多应用程序。多线程(=您的情况)意味着您的应用程序确实使用更多线程来完成其任务。

答案 1 :(得分:0)

用户界面或其他繁重的对象管理工作的常用方法是像你一样包围你的代码,但你应该使用drain

NSAutoreleasePool *dbPool = [[NSAutoreleasePool alloc] init];

// do your work

[dbPool drain];

NSAutoreleasePool上有很多详细信息here和之前的Stack Overflow回复here。基本上,您在池中进行的工作(如果设置为autorelease)将在池耗尽后释放。在处理生成自动释放实例的某些类时,这可以提高性能。如果你想要完全和立即控制,你可以release一旦你不再需要你正在使用的每个对象,并完全放弃池。

至于你的多线程问题,我不确定我是否理解你所问的内容,但即使在后台线程中使用池也是一种可靠的方法。这假设您在线程中使用的对象不会以某种方式在另一个中使用(因为您可能会意外释放)。