雖然swift是以后開發(fā)的趨勢,但是OC里面的基礎(chǔ)還是要知道,對swift的理解也會有幫助。
1 三者的區(qū)別
首先,引用計數(shù)的概念:表示對象被引用的次數(shù)。當(dāng)引用計數(shù)為 0 的時候,系統(tǒng)就會發(fā)送dealloc消息來釋放內(nèi)存。
- assign:用于基本數(shù)據(jù)類型,沒有引用計數(shù),因此不存在增加或減少引用計數(shù);
- retain: 對象引用計數(shù)會+1;
- copy:
- 1 可變對象為深拷貝(指針賦值且在堆里面將對象賦值一份,引用計數(shù)不變),不可變對象為淺拷貝(只對指針賦值然后引用計數(shù)+1)。所謂深拷貝就是給指針賦值且指向的對象也拷貝一份,淺拷貝只給指針賦值不拷貝對象。
- 2 可變與不可變對象的轉(zhuǎn)變:不可變對象→可變對象的轉(zhuǎn)換:對象.mutableCopy。可變->不可變:對象.copy;
- 3 為什么可變對象與不可變對象有深淺拷貝之分呢?很簡單,出于對節(jié)省內(nèi)存的考慮。對于不可變對象,因為它不可變,所以無論有多少使用者,都是同一份東西,那么我只要在內(nèi)存中保留一份即可。而對于可變對象,假設(shè)甲乙都引用了A,甲改變了A,如果乙再使用可能就會引起錯誤。——原因是個人猜測
- 4 最后,深淺拷貝這種說法可以區(qū)分兩種拷貝,只是一種叫法,但是剛接觸讓人很迷糊。
2 釋放方法
- release:對象引用計數(shù)-1,如果為 0 則發(fā)送 dealloc 釋放內(nèi)存;
- autorelease:只是把對象放入自動釋放池,這是一個編譯器屬性,編譯器會在合適的地方調(diào)用autorelease。
- MRC 與 ARC:手動管理內(nèi)存和自動管理內(nèi)存,(先說下引用計數(shù))手動管理需要程序員調(diào)用 retain release 等方法來手動管理內(nèi)存。自動管理是把對象指針放進(jìn)自動釋放池,當(dāng)自動釋放池被銷毀時發(fā)送 release 消息,引用計數(shù)-1,如果減為0則系統(tǒng)自動發(fā)送dealloc釋放內(nèi)存。
- 另外,Core Foundation的對象為C對象,自動釋放池不會接管,需要另一套:CFRetain與CFRelease。