在iOS应用开发中,我们使用NSAutoreleasePool
在稍后的时间点放弃对象的所有权。
但是为什么它可以在不同的线程之间共享?
为什么我想在使用新线程时需要创建一个新的自动释放池?
修改
正如taskinoor所提到的,我的问题是为什么这个设计的方式是每个线程应该有一个单独的自动释放池。
答案 0 :(得分:5)
多线程自动释放池的设计挑战是何时耗尽它们。如果在对象仍在使用时排空池,则会崩溃。每个线程,很容易判断您何时在运行循环之外,因此可以排出自动释放的对象。在多线程情况下,您的线程需要在其runloop结束时进行同步,以便确保您处于安全点以排空它们。以这种方式同步踏板是一个坏主意,它会产生大量的空闲时间并减慢程序的速度。
答案 1 :(得分:2)
每个线程都是不同的执行上下文 - 一个线程可能迟早会退出,它们可能会使用具有不同生命周期和内存管理需求的不同资源,因此每个线程都应该独立管理。
答案 2 :(得分:1)
因为他们以这种方式设计。我猜你的问题是他们为什么这样设计的。我不是百分百肯定,但一个可能的原因可能是跨线程共享资源有其成本。在对共享池的每次修改期间,每个线程都需要锁定解锁,这会降低性能。只有在需要共享时才应在多个线程之间共享资源,而自动释放池则不是这种情况。使用专用的自动释放池将表现更好。这可能是此设计决策的一个可能原因。
答案 3 :(得分:0)
我不认为自动释放池是在线程之间共享的,根据Cocoa中的apples memory management guide,每个线程都有自己的自动释放池堆栈
如果您没有为您创建或分离的线程创建自动释放池,则自动释放功能不起作用,因此内存占用将增长