1吕朵,自動引用計(jì)數(shù)
對Objective-C對象的動作有:生成對象 ->持有對象->釋放對象-> 廢棄對象
對應(yīng)的方法有:
生成對象:alloc/new/copy/mutableCopy
持有對象:retain
釋放對象:release
廢棄對象:dealloc
為了高效使用有限的內(nèi)存,應(yīng)該在對象沒有被“人”使用的時(shí)候銷毀充坑,為了確定在何時(shí)對象沒人使用蒂秘,便引人了自動引用計(jì)數(shù)的概念泽本,自動引用計(jì)數(shù)是用于統(tǒng)計(jì)當(dāng)前對象被引用的計(jì)量(既是有多少人引用(使用)該對象),但其實(shí)姻僧,我們不應(yīng)該將注意力用在計(jì)數(shù)上规丽,反而更客觀,正確的思考方式是:
1撇贺,自己生成的對象赌莺,自己持有(alloc/new/copy/mutableCopy)
2,非自己生成的對象松嘶,自己也能持有(這個(gè)比較難理解艘狭,下面給出例子)
id obj = [NSMutableArray array];
NSLog(@"%ld", [objretain Count]);//打印結(jié)果為1,但是obj此時(shí)并不持有該對象喘蟆,因?yàn)橹灰皇墙?jīng)過alloc/new/copy/mutableCopy方法生成的對象 (而是[class object]方式缓升,內(nèi)部會調(diào)用alloc鼓鲁,copy等蕴轨,然后將生成的對象加入釋放池)都不能持有該對象
[obj retain];
NSLog(@"%ld", [objretain Count]); //打印結(jié)果為2,使用retain骇吭,obj此時(shí)持有該對象
3橙弱,不在需要自己持有的對象時(shí)釋放
[obj release] //obj此時(shí)釋放自己持有的對象
4,非自己持有的對象無法釋放
[obj release]//這會導(dǎo)致崩潰燥狰,因?yàn)榇藭r(shí)obj并不持有該對象棘脐,不用釋放非自己持有的對象,
上面也提到了autorelease龙致,顧名思義蛀缝,autorelease就是自動釋放,它很像C語言中的局部變量的特性目代,其實(shí)現(xiàn)過程可以模糊地理解為屈梁,先生成一個(gè)NSAutorelease對象嗤练,通過調(diào)用autorelease方法將對象添加到一個(gè)數(shù)組中,NSAutorelease對象被銷毀時(shí)在讶,遍歷之前的數(shù)組煞抬,給數(shù)組中的每一對象發(fā)送release消息
2.ARC規(guī)則
1,自己生成的對象构哺,自己持有
2革答,非自己生成的對象自己,自己也能持有曙强,
3残拐,不再需要自己持有的對象時(shí)釋放
4,非自己持有的對象不能釋放
這一思考方式也可以用在ARC下碟嘴,但是在ARC下必須拋棄之前介紹的自動引用計(jì)數(shù)的概念
在ARC有效時(shí)蹦骑,對象類型同其他的基本數(shù)據(jù)類型不同,其類型上必須附加所有權(quán)修飾符:
1, __ strong //注意下面開頭的是兩個(gè)連續(xù)的下滑線
2, __weak ?
3, __unsafe_unretained
4,__autoreleasing
2和3的主要區(qū)別是__weak修飾的變量在釋放時(shí)會自動指向nil臀防,__unsafe_unretained則是指向原地址(若是原地址被其他新數(shù)據(jù)占用時(shí)是很危險(xiǎn)的眠菇,會引起崩潰)
為了解決循環(huán)引用,便引人了__weak關(guān)鍵字袱衷,__weak關(guān)鍵字修飾的變量被稱為弱引用捎废,~~~未完待續(xù)~~~