ARC(Automatic Reference Counting)
是蘋果在iOS 5
開始引入的內(nèi)存管理機制疮胖,到今年(2021年)系統(tǒng)已經(jīng)發(fā)布到iOS 15
了,面試仍然會頻繁地提問關于MRC(Manual Reference Counting)
的問題闷板,即便新入行的同學們已經(jīng)開始廣泛地使用Swift
澎灸,甚至于他們完全沒接觸過Objective-C
,這玩意兒就是過不去了蛔垢。
assign&weak
相同
它們都可以用于修飾需要被弱引用
的對象击孩,并不會引起引用計數(shù)+1,以此避免循環(huán)引用鹏漆。
不同
-
assign
通常還用于修飾基礎數(shù)據(jù)類型(如NSInteger
巩梢、BOOL
等)和C
數(shù)據(jù)類型(如int
、float
艺玲,double
等)括蝠。基礎數(shù)據(jù)類型和C
數(shù)據(jù)類型會被分配到棧上饭聚,棧的內(nèi)存由系統(tǒng)處理忌警,不會造成野指針。 - 使用
weak
關鍵字修飾的對象秒梳,當該對象釋放后法绵,指針地址自動釋放;而使用assign
關鍵字修飾的對象釋放后酪碘,該指針依舊存在朋譬,形成野指針。
retain&strong©
相同
三者都用于修飾對象屬性兴垦,強引用徙赢,一般情況下,MRC
下使用retain
探越,ARC下使用strong
狡赐。
不同
-
copy
可以用于修飾block
,因為block
需要從棧區(qū)copy
到堆區(qū)钦幔;在ARC
下枕屉,系統(tǒng)會自動執(zhí)行該操作,因此block
也可以使用strong
修飾鲤氢。 -
strong
是淺拷貝搀庶,新的指針指向相同的內(nèi)存地址拐纱;copy
是深拷貝,會為對象開辟新的內(nèi)存地址哥倔,指針與內(nèi)存地址均與原對象不同。
注意揍庄,引用不可變對象咆蒿,即使是
copy
,也僅為淺拷貝蚂子。