写了这么久的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方法,释放内存。
从上图可以看出,st在整个使用过程中的引用次数变化。
其实在调用NSMutableArray等链表结构中的removeAllobject方法或release时,首先会掉用链中对象的release方法减少对象的retainCount,如果retainCount=0时,对象内存将被释放。