寫在前面:本文持續更新,也歡迎簡友提供更多的關于iOS(包括swift)中的區別
1. __ _block和 _ _ _weak修飾符的區別的:
(1). _ _block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。
(2). _ _weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
(3). _ _block對象可以在block中被重新賦值, _ _weak不可以。
注: 變量對象在block中是只讀的,前面用_ _block修飾是為了讓block是復制其引用地址來實現對外界變量的訪問。
2.assign和weak有什么區別
一 、區別
(1).修飾變量類型的區別 weak只可以修飾對象。如果修飾基本數據類型,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。assign 可修飾對象,和基本數據類型。當需要修飾對象類型時,MRC時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指針,所以它名字是"unsafe_”。
(2).是否產生野指針的區別 weak不會產生野指針問題。因為weak修飾的對象釋放后(引用計數器值為0),指針會自動被置nil,之后再向該對象發消息也不會崩潰。 weak是安全的。assign 如果修飾對象,會產生野指針問題;如果修飾基本數據類型則是安全的。修飾的對象釋放后,指針不會自動被置空,此時向對象發消息會崩潰。
二、相似
都可以修飾對象類型,但是assign修飾對象會存在問題
三、總結
assign 適用于基本數據類型如int,float,struct等值類型,不適用于引用類型。因為值類型會被放入棧中,遵循先進后出原則,由系統負責管理棧內存。而引用類型會被放入堆中,需要我們自己手動管理內存或通過ARC管理。weak 適用于delegate和block等引用類型,不會導致野指針問題,也不會循環引用,非常安全。當然怎么選擇使用assign還是weak,MRC的話只能用assign,在ARC的情況下最好使用weak,因為weak修飾的變量在釋放后自動指向nil,防止野指針存在。
3. copy與retain(strong)的區別
謝謝簡友 追善的指出, 此條之前的說法的確不夠嚴謹,吾正在詳細創造中... 下面先放個圖
copy修飾的可變與不可變.png
4.assign和retain的區別
assign就是直接賦值,從而可能引起1中的問題,當數據為int, float等原生類型時,可以使用assign。retain就如2中所述,
使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收。
5. extension和category的區別
extension看起來很像一個匿名的category,但是extension和有名字的category幾乎完全是兩個東西。
extension在編譯期決議,它就是類的一部分,在編譯期和頭文件里的@interface以及實現文件里的@implement一起形成一個完整的類,它伴隨類的產生而產生,亦隨之一起消亡。extension一般用來隱藏類的私有信息,你必須有一個類的源碼才能為一個類添加extension,所以你無法為系統的類比如NSString添加extension。
但是category則完全不一樣,它是在運行期決議的。就category和extension的區別來看,我們可以推導出一個明顯的事實,extension可以添加實例變量,而category是無法添加實例變量的(因為在運行期,對象的內存布局已經確定,如果添加實例變量就會破壞類的內部布局,這對編譯型語言來說是災難性的)。
6. const和宏(define)的區別
1.define在預處理階段進行替換,const常量在編譯階段使用
2.define不做類型檢查,僅僅進行替換,const常量有數據類型,會執行類型檢查
3.define不能調試,const常量可以調試
4.define定義的常量在替換后運行過程中,會不斷地占用內存,而const定義的常量存儲在數據段,只有一份copy,效率更高。
5.define可以定義一些簡單的函數和方法,而const不能
7. id 和 instancetype 的區別
1. instancetype 和 id 都是萬能指針,指向對象。
2. 不同點:
id在編譯的時候不能判斷對象的真實類型,instancetype在編譯的時候可以判斷對象的真實類型
id可以用來定義變量,可以作為返回值類型,可以作為形參類型;instancetype只能作為返回值類型
3. 注意:以后凡是自定義構造方法,返回值類型盡量使用instancetype,不要使用id
8.struct和class的區別
struct是值引用 深拷貝,不可繼承,swift更加推薦使用struct。
class是類引用 淺拷貝 可繼承
To be continued...