寫在前面:本文持續(xù)更新雳刺,也歡迎簡友提供更多的關(guān)于iOS(包括swift)中的區(qū)別
1. __ _block和 _ _ _weak修飾符的區(qū)別的:
(1). _ _block不管是ARC還是MRC模式下都可以使用萝喘,可以修飾對象笨奠,還可以修飾基本數(shù)據(jù)類型。
(2). _ _weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)敏释。
(3). _ _block對象可以在block中被重新賦值, _ _weak不可以摸袁。
注: 變量對象在block中是只讀的钥顽,前面用_ _block修飾是為了讓block是復(fù)制其引用地址來實(shí)現(xiàn)對外界變量的訪問。
2.assign和weak有什么區(qū)別
一 但惶、區(qū)別
(1).修飾變量類型的區(qū)別 weak只可以修飾對象耳鸯。如果修飾基本數(shù)據(jù)類型,編譯器會(huì)報(bào)錯(cuò)-“Property with ‘weak’ attribute must be of object type”膀曾。assign 可修飾對象县爬,和基本數(shù)據(jù)類型。當(dāng)需要修飾對象類型時(shí)添谊,MRC時(shí)代使用unsafe_unretained财喳。當(dāng)然,unsafe_unretained也可能產(chǎn)生野指針,所以它名字是"unsafe_”耳高。
(2).是否產(chǎn)生野指針的區(qū)別 weak不會(huì)產(chǎn)生野指針問題扎瓶。因?yàn)閣eak修飾的對象釋放后(引用計(jì)數(shù)器值為0),指針會(huì)自動(dòng)被置nil泌枪,之后再向該對象發(fā)消息也不會(huì)崩潰概荷。 weak是安全的。assign 如果修飾對象碌燕,會(huì)產(chǎn)生野指針問題误证;如果修飾基本數(shù)據(jù)類型則是安全的。修飾的對象釋放后修壕,指針不會(huì)自動(dòng)被置空愈捅,此時(shí)向?qū)ο蟀l(fā)消息會(huì)崩潰。
二慈鸠、相似
都可以修飾對象類型蓝谨,但是assign修飾對象會(huì)存在問題
三、總結(jié)
assign 適用于基本數(shù)據(jù)類型如int,float,struct等值類型青团,不適用于引用類型譬巫。因?yàn)橹殿愋蜁?huì)被放入棧中,遵循先進(jìn)后出原則壶冒,由系統(tǒng)負(fù)責(zé)管理?xiàng)?nèi)存缕题。而引用類型會(huì)被放入堆中,需要我們自己手動(dòng)管理內(nèi)存或通過ARC管理胖腾。weak 適用于delegate和block等引用類型,不會(huì)導(dǎo)致野指針問題瘪松,也不會(huì)循環(huán)引用咸作,非常安全。當(dāng)然怎么選擇使用assign還是weak宵睦,MRC的話只能用assign记罚,在ARC的情況下最好使用weak,因?yàn)閣eak修飾的變量在釋放后自動(dòng)指向nil壳嚎,防止野指針存在桐智。
3. copy與retain(strong)的區(qū)別
謝謝簡友 追善的指出, 此條之前的說法的確不夠嚴(yán)謹(jǐn)烟馅,吾正在詳細(xì)創(chuàng)造中... 下面先放個(gè)圖
copy修飾的可變與不可變.png
4.assign和retain的區(qū)別
assign就是直接賦值说庭,從而可能引起1中的問題,當(dāng)數(shù)據(jù)為int, float等原生類型時(shí)郑趁,可以使用assign刊驴。retain就如2中所述,
使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1捆憎,當(dāng)引用計(jì)數(shù)為0時(shí)舅柜,dealloc函數(shù)被調(diào)用,內(nèi)存被回收躲惰。
5. extension和category的區(qū)別
extension看起來很像一個(gè)匿名的category致份,但是extension和有名字的category幾乎完全是兩個(gè)東西。
extension在編譯期決議础拨,它就是類的一部分氮块,在編譯期和頭文件里的@interface以及實(shí)現(xiàn)文件里的@implement一起形成一個(gè)完整的類,它伴隨類的產(chǎn)生而產(chǎn)生太伊,亦隨之一起消亡雇锡。extension一般用來隱藏類的私有信息,你必須有一個(gè)類的源碼才能為一個(gè)類添加extension僚焦,所以你無法為系統(tǒng)的類比如NSString添加extension锰提。
但是category則完全不一樣,它是在運(yùn)行期決議的芳悲。就category和extension的區(qū)別來看立肘,我們可以推導(dǎo)出一個(gè)明顯的事實(shí),extension可以添加實(shí)例變量名扛,而category是無法添加實(shí)例變量的(因?yàn)樵谶\(yùn)行期谅年,對象的內(nèi)存布局已經(jīng)確定,如果添加實(shí)例變量就會(huì)破壞類的內(nèi)部布局肮韧,這對編譯型語言來說是災(zāi)難性的)融蹂。
6. const和宏(define)的區(qū)別
1.define在預(yù)處理階段進(jìn)行替換,const常量在編譯階段使用
2.define不做類型檢查弄企,僅僅進(jìn)行替換超燃,const常量有數(shù)據(jù)類型,會(huì)執(zhí)行類型檢查
3.define不能調(diào)試拘领,const常量可以調(diào)試
4.define定義的常量在替換后運(yùn)行過程中意乓,會(huì)不斷地占用內(nèi)存,而const定義的常量存儲(chǔ)在數(shù)據(jù)段约素,只有一份copy届良,效率更高。
5.define可以定義一些簡單的函數(shù)和方法圣猎,而const不能
7. id 和 instancetype 的區(qū)別
1. instancetype 和 id 都是萬能指針士葫,指向?qū)ο蟆?
2. 不同點(diǎn):
id在編譯的時(shí)候不能判斷對象的真實(shí)類型,instancetype在編譯的時(shí)候可以判斷對象的真實(shí)類型
id可以用來定義變量样漆,可以作為返回值類型为障,可以作為形參類型;instancetype只能作為返回值類型
3. 注意:以后凡是自定義構(gòu)造方法,返回值類型盡量使用instancetype鳍怨,不要使用id
8.struct和class的區(qū)別
struct是值引用 深拷貝呻右,不可繼承,swift更加推薦使用struct鞋喇。
class是類引用 淺拷貝 可繼承
To be continued...