autorelease
基本使用
autorelease方法會(huì)放回對(duì)象本身伶棒。這句話先記住
autorelease就是將我們的所有的對(duì)象放到一個(gè)自動(dòng)釋放池中
當(dāng)我們的自動(dòng)釋放池殺之前攒驰,他會(huì)做一個(gè)操作就是對(duì)我們自動(dòng)釋放池里面的所有對(duì)象做一次release操作
而我們?nèi)绾问褂梦覀兊淖詣?dòng)釋放池呢?
就是我們?cè)趧?chuàng)建對(duì)象的時(shí)候三痰,我們應(yīng)該這樣創(chuàng)建
有沒有注意到我們的Xcode一旦創(chuàng)建了一個(gè)新的項(xiàng)目的時(shí)候,我們的main函數(shù)里面就會(huì)有這樣的一段代碼:
注意這里面的有一個(gè)autoreleasepool這個(gè)就是我們的自動(dòng)釋放池他的作用就如上面講的所以要想我們的對(duì)象能夠不必我們操心(有我們的自動(dòng)釋放池)幫助我們給我們的對(duì)象做最后一次的release操作就需要我們將我們的對(duì)象創(chuàng)建代碼寫在我們的autoreleasepool里面去所以我們的代碼格式就如下:
使用注意:
1窜管、自動(dòng)釋放池可以創(chuàng)建出無(wú)限多個(gè)散劫,而且可以嵌套
2、我們調(diào)用autorelease方法時(shí)幕帆,并不會(huì)是我們的對(duì)象計(jì)數(shù)器減1获搏,只有當(dāng)我們的釋放池被銷毀之前,才會(huì)減1失乾。
3常熙、我們的釋放池被放在一個(gè)數(shù)據(jù)處理的棧中(這個(gè)棧與先前說(shuō)的棧有所不同)越是放進(jìn)去的晚,越是先被釋放
4仗扬、缺點(diǎn):不能精確的控制對(duì)象被釋放的時(shí)間
5症概、適用對(duì)象:占用內(nèi)存很小的對(duì)象(意思就是我們以后除了一些小的對(duì)象其他的都不要放進(jìn)釋放池)至于對(duì)象占用內(nèi)存大小我們以后會(huì)分析
總結(jié):
內(nèi)存管理總結(jié):
ARC
基本原理
ARC是我們編譯器的特性
1、當(dāng)我們的程序在編譯的過(guò)程中早芭,我們的編譯器會(huì)自動(dòng)檢測(cè)我們的代碼中哪里需要插入我們的釋放內(nèi)存的代碼
2彼城、一旦我們使用我們的ARC之前寫的大部分代碼Xcode都不允許我們?nèi)?/p>
3、而我們的ARC在釋放我們的對(duì)象的時(shí)候也是需要一定的判斷依據(jù)的(哪一個(gè)對(duì)象需要被釋放退个、哪一個(gè)對(duì)象現(xiàn)在還不能被釋放)而這個(gè)依據(jù)與我們的指針強(qiáng)弱有關(guān)
至于什么是強(qiáng)指針募壕,什么是弱指針后面我們?cè)僦v。
4语盈、一旦發(fā)現(xiàn)我們的對(duì)象是被弱指針指向的時(shí)候我們的編譯器就會(huì)將我們的對(duì)象銷毀
@property的strong與weak
之前我們?cè)谑褂聾property的時(shí)候一般會(huì)這么寫
@property(nonatomic舱馅, retain)Dog *dog;
現(xiàn)在我們使用ARC之后我們要這樣寫;
@property(nonatomic刀荒, strong)Dog *dog代嗤;
在我們的代碼中必須寫上strong? 因?yàn)閷懪c不寫卻別很大
例如我們的人與狗的關(guān)系
如果我們想要人在狗就在棘钞,人亡狗就滅,的話我們就使用強(qiáng)指針
如果我們想要人亡干毅,狗不一定滅的話宜猜,就使用弱指針
循環(huán)引用
以前我們說(shuō)過(guò)的當(dāng)兩個(gè)對(duì)象相互引用 的時(shí)候,一般我們會(huì)一個(gè)用retain一個(gè)用assign
在我們ARC里面我們對(duì)于這樣的循環(huán)引用我們會(huì)選擇一個(gè)用strong一個(gè)用weak