Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我们需要为每个线程使用NSAutoreleasepool?_Objective C_Ios_Nsautoreleasepool - Fatal编程技术网

Objective c 为什么我们需要为每个线程使用NSAutoreleasepool?

Objective c 为什么我们需要为每个线程使用NSAutoreleasepool?,objective-c,ios,nsautoreleasepool,Objective C,Ios,Nsautoreleasepool,在iOS应用程序开发中,我们使用NSAutoreleasePool在稍后的时间点放弃对象的所有权 但是为什么它可以在不同的线程之间共享呢 当我想使用一个新线程时,为什么我们需要创建一个新的自动释放池 编辑: 正如taskinoor提到的,我的问题是为什么这样设计,每个线程都应该有一个单独的自动释放池。我不认为自动释放池在线程之间共享,根据Cocoa的说法,每个线程都有自己的自动释放池堆栈 如果不为创建或分离的线程创建自动释放池,则自动释放功能将不起作用,因此内存占用将增加每个线程都是不同的执行上

在iOS应用程序开发中,我们使用
NSAutoreleasePool
在稍后的时间点放弃对象的所有权

但是为什么它可以在不同的线程之间共享呢

当我想使用一个新线程时,为什么我们需要创建一个新的自动释放池

编辑:


正如taskinoor提到的,我的问题是为什么这样设计,每个线程都应该有一个单独的自动释放池。

我不认为自动释放池在线程之间共享,根据Cocoa的说法,每个线程都有自己的自动释放池堆栈


如果不为创建或分离的线程创建自动释放池,则自动释放功能将不起作用,因此内存占用将增加

每个线程都是不同的执行上下文-一个线程可能早晚退出,它们可能会使用具有不同生存期和内存管理需求的不同资源,所以每个线程都应该独立管理。

因为它们是这样设计的。我想你的问题是为什么他们会这样设计。我不是100%确定,但一个可能的原因可能是跨线程共享资源有其成本。在每次修改共享池的过程中,每个线程都需要锁定或解锁会降低性能的线程。只有在需要共享资源时,才应该跨多个线程共享资源,而自动释放池则不是这样。使用专用的自动释放池将执行得更好。这可能是该设计决策的一个可能原因

多线程自动释放池的设计挑战是何时排空它们。如果在对象仍在使用时排空池,则会崩溃。对于每个线程,很容易判断您何时处于运行循环之外,从而判断自动释放的对象何时可以被释放。在多线程情况下,您的线程需要在其运行循环结束时进行同步,这样您就可以确保处于安全点来排空它们。以这种方式同步踏板是一个坏主意,它会产生大量空闲时间并减慢程序的速度。

您应该考虑使用
@autoreleasepool{…}
而不是
NSAutoreleasePool
。根据文件,这是更有效的。如果你迁移到ARC,这是强制性的。我不知道你为什么需要编辑,我的回答解释了原因:)猜得好,但不完整。自动释放池必须为每个线程,因为如果所有线程都处于可以释放池的状态,则无法安全地释放池。如果任何线程在等待输入时被阻塞,那么就不会发生溢出。杰弗里的回答是正确的。@bbum,谢谢。我没有想过要把水池里的水排干,我同意杰弗里的答案比我的好;如果任何线程在等待任何东西时被阻塞——网络、线程状态、其他I/O——那么整个池将无法排空。