关于iPhone上的多线程

关于iPhone上的多线程,iphone,nsautoreleasepool,Iphone,Nsautoreleasepool,我有个问题。我的案例研究是,我有两个大型SQLite数据库,我希望使用线程(意味着同时使用两个进程)。效果好吗?我编写了以下代码: NSAutoreleasePool *dbPool; dbPool = [[NSAutoreleasePool alloc] init]; /* All Database work is performed here */ [dbPool release]; 请引导我。我这样做对不对?我应该用游泳池来排水还是排水 这样的话,这是不是使用并发进程,也就是说,它

我有个问题。我的案例研究是,我有两个大型SQLite数据库,我希望使用线程(意味着同时使用两个进程)。效果好吗?我编写了以下代码:

NSAutoreleasePool *dbPool;

dbPool = [[NSAutoreleasePool alloc] init];

/* All Database work is performed here */

[dbPool release];
请引导我。我这样做对不对?我应该用游泳池来排水还是排水

这样的话,这是不是使用并发进程,也就是说,它的行为与多任务处理相同


提前谢谢

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

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

你所说的sqlite数据库是什么意思?如何访问它?如果您通过CoreData访问它,您的内存中会保留以下内容:

  • 每个线程需要一个NSManagedObjectContext
  • 不要将NSManagedObjects传递给另一个线程,只需传递对象ID
  • 在将对象ID传递给另一个线程之前,请将其保存在传递对象ID之前修改/创建对象ID的线程中
有更多的规则,但这些是基本的规则


多任务意味着您可以一次运行多个应用程序。多线程(=您的案例)意味着您的应用程序确实使用了更多的线程来完成其任务。

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

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

// do your work

[dbPool drain];
有很多关于
NSAutoreleasePool
的详细信息可用,并且有一个以前的堆栈溢出答案。基本上,您在池中所做的工作,如果设置为
autorelease
,将在池排水后释放。这可以在处理某些生成自动释放实例的类时提高性能。但是,如果您想要完全且即时的控制,您可以
在不再需要处理的每个对象时释放它,并完全丢弃池


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

如果他只使用iPhone,他可以使用这两个对象。如果释放一个池导致它被释放,那么dealloc方法无论如何都会调用drain。@occulus:根据苹果的指导原则,“您通常应该使用
drain
,而不是
release
”,我会说,仅仅是为了模式的缘故。