NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity : 0];//array.retainCount = 1 NSString *str1 = [[NSString alloc] initWithString : @"A"];//str1.retainCount = 1 NSString *str2 = [[NSString alloc] initWithString : @"A"];//str2.retainCount = 1 [arr addObject : str1];//str1.retainCount = 2 [arr addObject : str2];//str2.retainCount = 2 [arr removeObject : str1];//str1.retainCount = 1 [arr release];//array.retainCount = 0;str2.retainCount = 1 //系統回收 array [str1 release];//str1.retainCount = 0 [str2 release];//str2.retainCount = 0 //系統回收str1&str2
NSMutableArray 照字面上的意思,就是一個可伸縮的陣列物件,等同於Java或是C#的ArrayList。
從上面的例子,可以看到 str1 跟 str2 初始化之後,retainCount 都是 1,加入陣列之後,array會自動將加入的物件retainCount +1,所以可以看到 str1 跟 str2 的retainCount變成了2。當 array 將物件移出陣列時,表示不再使用這個物件,所以會將這個物件做 -1的動作,如果是使用 removeAllObjects 移除全部物件,就會對陣列內部的物件一個一個送出 retain 的指令,每一個物件的 retainCount 就會 -1。
array 移出 str1 後,陣列裡面的物件只剩下 str2,這時如果 release 掉 array,array 會先將內部所有的物件送出 release 的指令,這就是為什麼 str2 的 retainCount 會變成 1 的原因。
最後的 release 不用多說,str1 跟 str2 都變成了0,系統回收記憶體。
那除了會自動 retain 跟 release 以外,會不會自動 autorelease 呢?答案是肯定的!
例如:
NSString *str = [NSString stringWithString : @"ABC"]; //等於 NSString *str = [[NSString alloc] initWithString : @"ABC"] autolease]; //等於 NSString *str = [NSString alloc] initWithString : @"ABC"]; [str release];
會造成這種結果的原因一時很難說清楚,與物件一開始生成配置的記憶體方式有關,stringWithString 是用 allocWithZone配置,而 initWithString 如我們所宣告的,是用 alloc 配置。但是這不是本篇要探討的,所以目前就先記得這種 class method 所宣告的物件,本身自己會帶有 autorelease 的指令。
下一篇會講物件的直接存取與間接存取的差異,以及function return value 的retain與release。
延伸閱讀:Objective-C 的記憶體回收機制(上)
延伸閱讀:Objective-C 的記憶體回收機制(下)
沒有留言:
張貼留言