2014-01-13 52 views
1

在约NSAutoReleasePool https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html 它指向的是 “的应用开发包在事件循环的每个周期的开始创建主线程自动释放池”苹果API参考。Runloop和autoreleasePool

它困惑我。我对此有三个问题。

1)什么是“应用套件”? UIKit的?如果“The Application Kit”是指UIKit,那么我创建一个不使用UIkit的应用程序。它会在事件循环的每个循环开始时在主线程上创建一个autoreleasePool吗?

2)“在主线程上”是指在其他线程上(Not mainThread)会打破这个规则?

3)“事件循环”是指runloop?

# #

地址: 我写的一个演示,以测试它。当我创建一个线程时,会自动通过runloop创建一个autoreleasePool?

enter image description here enter image description here

然后,在应用MainThread,创建taskThread。 enter image description here

结果: enter image description here

所以,问题2)是“在主线程”是指在其他线程(不mainThread)将打破这个规则? 在这个演示中,事实并非如此。每个runloop的第二个线程会自动创建一个autoreleasePool。因为autoreleaseObject的dealloc方法被调用。

我的演示有什么问题吗?它让我困惑。

回答

1
  1. 您正在查看Mac文档。 AppKit是UIKit的Macintosh版本。两者都有关于autorelease池的几乎相同的逻辑
  2. 是的。一个新线程不会自动拥有一个autorelease池或一个事件循环。话虽如此,大多数时候你不会自己创建新线程。有喜欢的GCD和的NSOperation事情做太多的你所需要的,无需进行手动东西
  3. 我认为这个目的的这一点,是
+0

1.将它在开始创建主线程上autoreleasePool事件循环的每个循环都不是基于UIKit? 2.我写一个演示来测试它。我创建了一个没有autoreleasePool的线程。在这个线程中,我创建了一个autorelease对象。当线程结束时,调用autorelease Object dealloc。为什么? –

+0

1.否,因为运行循环是UIKit/AppKit的属性。毫无疑问,其他框架将会有一个。 2.“在Objective-C框架中链接的应用程序通常必须在其每个线程中至少创建一个自动释放池”https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Multithreading/CreatingThreads/CreatingThreads .html –

+0

1. Runloop是UIKit的一个属性吗?我不这么认为。每个线程都有一个且只有一个runloop,它根据需要自动创建。 2。我写这个demo想测试wheather,第二个线程每个runloop都会创建autoreleasePool,Only。 –