定義1個Person類
其實援用計數(shù)這個問題大家可以理解為租房子的問題, 如果有retain alloc 代表這個人租了這間大房子, 拿到了1把鑰匙, 援用計數(shù)代表房子1共有的鑰匙的數(shù)量, release代表退房歸還鑰匙
Person * p = [[Person alloc] init];//房東蓋好了1間房子, 現(xiàn)在是房東1個人
//alloc 開辟空間,援用計數(shù)由0變成1
//retainCount,用于查看對象的援用計數(shù)
NSLog(@"%lu", [p retainCount]);
Person * p1 = [p retain];// retain1次, 代表又來1個人租房
NSLog(@"p1 = %lu", [p1 retainCount]);//援用計數(shù)1⑵
NSLog(@"%lu", [p retainCount]);//援用計數(shù)1⑵
Person * p2 = p1;//沒有retain 也沒有alloc 援用計數(shù)不變. 就相當于p1帶他的朋友來住,朋友沒有鑰匙的
//release 減少援用計數(shù)(歸還鑰匙)
[p release];//援用計數(shù)2⑴
[p release];//援用計數(shù)1-0(但是如果我們去輸出的話, 多是會顯示崩潰, 或是1, 緣由以下:)
NSLog(@"%lu", [p retainCount]);// 首先這樣寫肯定是不對的 , 最后1次release,系統(tǒng)已回收掉這塊內存,空間已還給系統(tǒng),空間已不歸你管理,如果此時在訪問,就訪問了1塊沒有所有權的空間,所以下面的操作可能會出現(xiàn)野指針問題
我們還以上面的租房子問題為例, 現(xiàn)在這間房子最后1個人已走了, 已沒有人住了, 按說鑰匙已全部交上去了, 但是我們現(xiàn)在的操作就像是又拿著他的鑰匙去開那個門, 這是非常不安全的.那為何有時候會崩潰而有時候可以打印出1呢, 這是由于如果這塊內存他人還沒有使用, 就像是房子還沒有租出去, 你再回去拿鑰匙開門還是安全的, 但是如果這間房子又已租出去, 即已有別的數(shù)據(jù)在使用這塊內存, 那你再回去開門, 那你的處境是相當?shù)牟话踩心居???
[p release];//野指針問題 +過渡釋放,這個也很好理解, 大家可以理解成有房客拿1把鑰匙, 不但要開門, 還要拿著這個鑰匙再去歸還1次, 要房東再次退房子押金, 背法了, 直接崩~
內存問題其實除上面提到的野指針和過度釋放, 還有1個, 那就是內存泄漏, 內存泄漏我們可以理解為, 1為租客租房子最后鑰匙沒有歸還, 這樣房東也沒有辦法打開這間房子, 這間房子就沒有辦法再租出去, 致使內存浪費, 固然, 房東在有別的房子出租的時候, 對他來說并沒有太大的影響, 但是1旦這樣的房客有好多,房子不夠租, 房東掙錢會愈來愈慢, 終究可能致使做不下去~
本文只是個人對內存援用計數(shù)的1些理解 有甚么不對的地方, 大家多多指出~