雖然swift是以后開發(fā)的趨勢被饿,但是OC里面的基礎(chǔ)還是要知道,對(duì)swift的理解也會(huì)有幫助永丝。
1 三者的區(qū)別
首先锹漱,引用計(jì)數(shù)的概念:表示對(duì)象被引用的次數(shù)。當(dāng)引用計(jì)數(shù)為 0 的時(shí)候,系統(tǒng)就會(huì)發(fā)送dealloc消息來釋放內(nèi)存慕嚷。
- assign:用于基本數(shù)據(jù)類型,沒有引用計(jì)數(shù),因此不存在增加或減少引用計(jì)數(shù);
- retain: 對(duì)象引用計(jì)數(shù)會(huì)+1;
- copy:
- 1 可變對(duì)象為深拷貝(指針賦值且在堆里面將對(duì)象賦值一份,引用計(jì)數(shù)不變),不可變對(duì)象為淺拷貝(只對(duì)指針賦值然后引用計(jì)數(shù)+1)哥牍。所謂深拷貝就是給指針賦值且指向的對(duì)象也拷貝一份毕泌,淺拷貝只給指針賦值不拷貝對(duì)象。
- 2 可變與不可變對(duì)象的轉(zhuǎn)變:不可變對(duì)象→可變對(duì)象的轉(zhuǎn)換:對(duì)象.mutableCopy嗅辣『撤海可變->不可變:對(duì)象.copy;
- 3 為什么可變對(duì)象與不可變對(duì)象有深淺拷貝之分呢?很簡單澡谭,出于對(duì)節(jié)省內(nèi)存的考慮愿题。對(duì)于不可變對(duì)象,因?yàn)樗豢勺兺芙保詿o論有多少使用者潘酗,都是同一份東西,那么我只要在內(nèi)存中保留一份即可雁仲。而對(duì)于可變對(duì)象仔夺,假設(shè)甲乙都引用了A,甲改變了A攒砖,如果乙再使用可能就會(huì)引起錯(cuò)誤缸兔。——原因是個(gè)人猜測
- 4 最后吹艇,深淺拷貝這種說法可以區(qū)分兩種拷貝惰蜜,只是一種叫法,但是剛接觸讓人很迷糊受神。
2 釋放方法
- release:對(duì)象引用計(jì)數(shù)-1抛猖,如果為 0 則發(fā)送 dealloc 釋放內(nèi)存;
- autorelease:只是把對(duì)象放入自動(dòng)釋放池,這是一個(gè)編譯器屬性路克,編譯器會(huì)在合適的地方調(diào)用autorelease樟结。
- MRC 與 ARC:手動(dòng)管理內(nèi)存和自動(dòng)管理內(nèi)存,(先說下引用計(jì)數(shù))手動(dòng)管理需要程序員調(diào)用 retain release 等方法來手動(dòng)管理內(nèi)存。自動(dòng)管理是把對(duì)象指針放進(jìn)自動(dòng)釋放池,當(dāng)自動(dòng)釋放池被銷毀時(shí)發(fā)送 release 消息精算,引用計(jì)數(shù)-1瓢宦,如果減為0則系統(tǒng)自動(dòng)發(fā)送dealloc釋放內(nèi)存。
- 另外灰羽,Core Foundation的對(duì)象為C對(duì)象驮履,自動(dòng)釋放池不會(huì)接管,需要另一套:CFRetain與CFRelease廉嚼。