0

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

NSAutoreleasePool *dbPool;

dbPool = [[NSAutoreleasePool alloc] init];

/* All Database work is performed here */

[dbPool release];

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

这样是不是使用并发进程,这意味着它也与多任务处理相同?

提前致谢!

4

2 回答 2

1

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

关于您关于释放/排放池的问题,建议使用排放消息。

sqlite数据库是什么意思?你如何访问它?如果您通过 CoreData 访问它,您的记忆中会一直保持以下内容:

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

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

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

于 2011-03-27T18:18:34.727 回答
0

用户界面或其他繁重对象管理工作的常见方法是像您正在做的那样围绕您的代码,但您应该使用drain

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

// do your work

[dbPool drain];

此处提供了很多详细信息,NSAutoreleasePool此处提供以前的 Stack Overflow 答案。基本上,如果设置为 ,您在池中所做的工作将在池耗尽后释放。当使用某些生成自动释放实例的类时,这可以提高性能。但是,如果您想要完全和直接的控制,您可以在不再需要使用的每个对象时完全放弃池。autoreleaserelease

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

于 2011-03-27T18:19:19.007 回答