object-c中对NSMutableArray中存储对象的内存引用测试

时间:2022-04-28 05:32:34

写了这么久的ios程序了,最开始由于项目时间紧,没能深入了解object-c中内存的引用和释放,所以偶尔程序无缘无故的就蹦了。

今天仔细看了下程序中对象的retainCount值,才发现很多代码存在内存泄露问题。

retainCount就是当前对象被引用的次数,对象完全释放后retainCount=0,你在xcode的监视窗口可以看到对象上的属性值(引用类型)都已释放了。

看下面一个例子就明白了。

我在程序初始化时创建了两个链(NSMutableArray),listOfStations,allStations。初始化时这两个链装的东西都一样,后面会根据条件listOfStations中会显示部分allStations中的对象。

{//进入方法体

station *st = [[[station alloc] myInit:xx] autoRelease]; //为了在后面不会忘记减少st的retainCount值,这里先autoRelease(也可以在使用完st后调用[st release])。此行.代码执行后st.retainCount = 1。

…..

[listOfStations addobject:st];  //st.retainCount = 2;

[allStations addobject:st]; //st.retainCount = 3;

//[st release];

…..}

//此时st.retainCount = 2,退出方法后,st会自动调用release一次

下面就是在view关闭时调用的当前窗口的[self.view release],时调用当前窗口类的dealloc方法,释放内存。

object-c中对NSMutableArray中存储对象的内存引用测试

 

从上图可以看出,st在整个使用过程中的引用次数变化。

其实在调用NSMutableArray等链表结构中的removeAllobject方法或release时,首先会掉用链中对象的release方法减少对象的retainCount,如果retainCount=0时,对象内存将被释放。