1陆爽、引用計數(shù)
引用計數(shù)就是當前的對象被多少個其他對象所引用胶逢。這是我自己的理解。
MRC:手動引用計數(shù)俗扇,開發(fā)者自己來計算每一個對象被引用了多少次硝烂,自己進行內(nèi)存的釋放。
ARC:自動引用計數(shù)铜幽,編譯器(xcode)來計算每一個對象的引用次數(shù)滞谢,對象由編譯器來決定什么時候釋放。
進一步說除抛,所謂的ARC就是編譯器幫我們在代碼的合適位置插入了retain和release等MRC需要開發(fā)者手動寫的關(guān)于對象引用計數(shù)的代碼狮杨。
ARC環(huán)境:
1>xcode4.2或以上版本
2>LLVM3.0以上的編譯器
3>編譯器選項中設(shè)置ARC為有效
2、理解引用計數(shù)
舉個簡單的例子(可能不是那么貼切):
假如工作室里只有一盞燈到忽,每個上班的員工上班時間都需要開燈橄教,下班時間都需要關(guān)燈。假如有很多人上下班,最早上班的人A開了燈护蝶,A工作了八個小時下班了华烟,把燈關(guān)掉,這樣的話持灰,沒有下班的其他人都會處在一片黑暗之中垦江。這樣顯然是不合理的,那么該如何解決呢搅方?
解決這一問題是在辦公室至少還有一人的狀態(tài)下保持開燈,在最后一個人離開辦公室的時候關(guān)燈绽族。
我們來捋一下這個過程:
1>第一個進來的人需要照明姨涡,開燈
2>之后進來的人需要照明
3>下班離開辦公室的人不需要照明
4>最后一個離開辦公室的人不需要照明(此時已經(jīng)無人需要照明),關(guān)燈
我們可以使用“引用計數(shù)”來判斷辦公室里是否還有人需要照明吧慢。過程如下:
1>第一個人進來了涛漂,需要照明,引用計數(shù)從0變?yōu)?检诗,要開燈
2>第二個人進來了匈仗,需要照明,引用計數(shù)從1變?yōu)?
3>第一個人離開了逢慌,不需要照明悠轩,引用計數(shù)從2變?yōu)?
4>第二個人離開了,不需要照明攻泼,引用計數(shù)從1變?yōu)?火架,關(guān)燈
總結(jié):只要引用計數(shù)=0,就是關(guān)燈狀態(tài)忙菠,否則就是開燈狀態(tài)何鸡。
在OC中,“對象”就是照明設(shè)備牛欢,那些使用該對象的“環(huán)境”就相當于需要照明的人骡男。
開燈——生成對象(alloc,new傍睹,copy等)
需要照明——持有對象(retain等)
不需要照明——釋放對象(release)
關(guān)燈——廢棄對象(地址被回收隔盛,這個對象煙消云散了)
下面是個人理解的對象生命周期:
Person是一個類
Person * xiaoming = [[Person alloc]init];
這個時候再內(nèi)存中開辟了一塊內(nèi)存空間,并初始化這個對象焰望。引用計數(shù)從0變?yōu)?骚亿,相當于開燈。
Person * xiaohong = xiaoming;
這時候引用計數(shù)要增加了熊赖。相當于又有人需要照明来屠,引用計數(shù) = 2.
然后xiaohong在使用完這個對象之后就把對象釋放了。現(xiàn)在引用計數(shù)-1,引用計數(shù)=1
[xiaohong release];
xiaoming在使用完這個對象的時候也進行了釋放俱笛。相當于不需要照明捆姜,引用計數(shù)-1,引用計數(shù) = 0 .
[xiaoming release];
這個時候,系統(tǒng)發(fā)現(xiàn)引用計數(shù)已經(jīng)等于0了迎膜,這塊空間需要釋放回收了泥技,回到最初的狀態(tài),于是變成下圖的樣子磕仅。
在這里簡單說說內(nèi)存泄漏的情形吧珊豹。
內(nèi)存泄漏就是有些地址已經(jīng)不使用了,但是依然有指針指向它導致這塊地址空間不能釋放榕订。如下圖所示:
這是我自己的理解店茶,如有不妥之處還請各位不吝賜教。如果您看到這篇文章劫恒,對您有一點點的幫助贩幻,將是我最開心的事!