內(nèi)存管理是指軟件運(yùn)行時(shí)對(duì)計(jì)算機(jī)內(nèi)存資源的分配和使用技術(shù)卓箫,其最重要的目的是如何高效载矿、快速的分配,并且在適當(dāng)?shù)臅r(shí)候釋放和回收內(nèi)存資源烹卒。
iOS中數(shù)據(jù)是存在堆和棧中的闷盔,然而我們的內(nèi)存管理管理的堆上的內(nèi)存,棧上的內(nèi)存并不是我們管理
assign:用于對(duì)基本數(shù)據(jù)類型進(jìn)行賦值操作旅急,不更改引用計(jì)數(shù)逢勾。也可以用來修飾對(duì)象,但是坠非,被assign修飾的對(duì)象在釋放后敏沉,指針的地址還是存在的,也就是說指針并沒有被置為nil炎码,成為野指針。如果后續(xù)在分配對(duì)象到堆上的某塊內(nèi)存時(shí)秋泳,正好分到這塊地址潦闲,程序就會(huì)crash。之所以可以修飾基本數(shù)據(jù)類型迫皱,因?yàn)榛緮?shù)據(jù)類型一般分配在棧上歉闰,棧的內(nèi)存會(huì)由系統(tǒng)自動(dòng)處理,不會(huì)造成野指針卓起。
簡(jiǎn)單賦值和敬,不更改索引計(jì)數(shù)(Reference Counting)。?
weak:修飾Object類型戏阅,修飾的對(duì)象在釋放后昼弟,指針地址會(huì)被置為nil,是一種弱引用奕筐。在ARC環(huán)境下舱痘,為避免循環(huán)引用,往往會(huì)把delegate屬性用weak修飾离赫;在MRC下使用assign修飾芭逝。weak和strong不同的是:當(dāng)一個(gè)對(duì)象不再有strong類型的指針指向它的時(shí)候,它就會(huì)被釋放渊胸,即使還有weak型指針指向它旬盯,那么這些weak型指針也將被清除。
ARC下的strong等同于MRC下的retain都會(huì)把對(duì)象引用計(jì)數(shù)加1。
copy:會(huì)在內(nèi)存里拷貝一份對(duì)象胖翰,兩個(gè)指針指向不同的內(nèi)存地址频丘。一般用來修飾NSString等有對(duì)應(yīng)可變類型的對(duì)象,因?yàn)樗麄冇锌赡芎蛯?duì)應(yīng)的可變類型(NSMutableString)之間進(jìn)行賦值操作泡态,為確甭可變對(duì)象變化時(shí),對(duì)象中的字符串不被修改 某弦,應(yīng)該在設(shè)置屬性時(shí)拷貝一份桐汤。而若用strong修飾,如果可變對(duì)象變化靶壮,對(duì)象中的字符串屬性也會(huì)跟著變化怔毛。
建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,然后釋放舊對(duì)象?
retain:釋放舊的對(duì)象腾降,將舊對(duì)象的值賦予輸入對(duì)象拣度,再提高輸入對(duì)象的索引計(jì)數(shù)為1?
nonatomic關(guān)鍵字:?
atomic是Objc使用的一種線程保護(hù)技術(shù),基本上來講螃壤,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取抗果,造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的奸晴,所以在iPhone這種小型設(shè)備上冤馏,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇寄啼。
assign和weak的區(qū)別:
共同點(diǎn):
1.都是弱引用逮光,不增加引用計(jì)數(shù)
2.都可以作用于對(duì)象
不同點(diǎn):
1.assign即可作用于對(duì)象也可以作用于基本數(shù)據(jù)類型(int等,weak修飾基本數(shù)據(jù)類型會(huì)報(bào)錯(cuò))
2.weak不會(huì)產(chǎn)生野指針墩划,因?yàn)閣eak修飾的對(duì)象釋放后(引用計(jì)數(shù)為0)涕刚,指針會(huì)被系統(tǒng)置為nil,之后再向該對(duì)象發(fā)生消息也不會(huì)崩潰乙帮;
assign則會(huì)產(chǎn)生野指針杜漠,如果修飾的是對(duì)象,當(dāng)修飾的對(duì)象被釋放后蚣旱,指針不會(huì)自動(dòng)置空碑幅,此時(shí)向該對(duì)象發(fā)送消息則會(huì)崩潰