Threads
If you are making Cocoa calls outside of the Application Kit’s main thread—for example if you create a Foundation-only application or if you detach a thread—you need to create your own autorelease pool.
If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should periodically drain and create autorelease pools (like the Application Kit does on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If, however, your detached thread does not make Cocoa calls, you do not need to create an autorelease pool.
如果你如果你创建了一个只有foundation框架的应用或者你创建了一个子线程,你需要创建自己的自动释放池。
如果你的程序或者线程长久的存在,或者潜在的生成大量的自动释放对象。你应该周期性的释放和创建自动释放池(像UIKit在主线程创建自动释放池)。否则,你的自动释放对象会累计,内存会溢出。如果,然而你分理出子线程却没有调用cocoa,你没有必要创建自动释放池。
cocoa包括两个重要的oc对象库,称为框架。
foundation工具包,作为通用的面向对象的函数库,foundation提供了字符串,数值的管理,容器及其枚举,分布式计算,事件循环以及其他一些与图形用户界面没有直接关系的功能。其中用于类和常数的NS前缀来自于cocoa的来源。
应用程序工具包或称为UIKit,或称为AppKit,它包含了程序与界面交互所需的代码。它是基于foundation框架建立的,也适用NS前缀,只能在Mac OS X中使用。
用户界面工具包,或称为UIKit,适用于iOS的图形用户界面工具包。与AppKit不同的是,它使用“UI”的前缀。
cocoa架构的一个关键部分是多样的图形模型。
Note
注意
If you are creating secondary threads using the POSIX thread APIs instead of NSThread objects, you cannot use Cocoa, includingNSAutoreleasePool, unless Cocoa is in multithreading mode. Cocoa enters multithreading mode only after detaching its firstNSThreadobject. To use Cocoa on secondary POSIX threads, your application must first detach at least oneNSThreadobject, which can immediately exit. You can test whether Cocoa is in multithreading mode with theNSThreadclass method isMultiThreaded.
如果你利用POSIX thread创建子线程而不是NSThread,你不可以应用cocoa,包括自动释放池。除非cocoa是multithreading模式。。。。
因此:我们可以看到在AFNetworking以及SDWebImage中可以看到,它们都用到了自动释放池。
原理:因为在子线程中并没有自动释放池,导致我们尽管使用了autorelease,但是因为没有自动释放池导致无法释放。