Instance Deallocation(对象的回收)
就像上一章中内存管理描述的那样,当一个对象不再有用的时候,它就要被回收。当不使用垃圾回收机制时,我们通过调用dealloc方法来回收对象并释放内存空间。当使用垃圾回收机制时,你仍然可以使用dealloc方法,只不过需要调用dealloc方法的次数会少很多。
当不启用垃圾回收机制时,dealloc方法必须release释放掉所有被当前对象retain过的对象。通常当前对象retain过的其他对象不是primitive(基础)类型(比如int、float…)。对于容器类的对象(NSArray数组对象),容器中的所有对象都必须被release掉。另外,如果一个对象获取了一些外部资源,比如网络链接或者打开一个文件的话,这些资源也必须放弃。同样,对象通过malloc等具有内存分配功能的函数申请的内存空间也必须被释放。
当启用垃圾回收机制时,仍然需要调用dealloc方法来释放掉对象获取的外部资源,但是其他的部分就不用手动调用dealloc方法了。因为其他部分有垃圾回收机制自动回收了。
如果你无法确定,当前是否已经启用了垃圾回收机制。实际上,你依然可以当作没有启用垃圾回收机制,然后去dealloc对象占用的所有资源。这样做即便是在启用垃圾回收机制的情况下,也不会对垃圾回收机制造成什么影响,只是会中断垃圾回收机制自动的retain/release方法调用而已,如果这么做对你的应用程序的性能造成了一些影响的话,你可以用宏RETAIN/RELEASE来代替函数调用。 这里有个例子,如下:
- dealloc
{
RELEASE(anInstanceVariableObject);
NSZoneFree(NULL, myMemory);
[super dealloc];
}
上述代码中,我们使用RELEASE宏来release了对象,然后用NSZoneFree()
函数收回了之前用NSZoneMalloc()
函数(后面会详细讲解)分配的内存空间。NULL通常指向内存缺省区域,这等同于调用NSDefaultMallocZone()
。
注意,最后我们调用了父类的dealloc方法[super dealloc];
。通常在dealloc方法中都会这么做。
{$ activeFileHint $}