iOSSharing #7 | 2019-05-05

目錄

1. id、self、super 它們從語法上有什麼區別?

2. block 修改捕獲變量除了用 __block 還能夠怎麼作?有哪些侷限性?

3. 什麼狀況使用 weak 關鍵字,相比 assign 有什麼不一樣?

4. weak屬性須要在dealloc中置nil麼?

5. ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?

1. id、self、super 它們從語法上有什麼區別?

  • id 可做爲方法的返回值類型、參數類型,以及變量的類型
  • self 能夠用來調用方法,在實例方法中表明當前類的實例,在類方法中表明當前類,多態的一個對象, 它只能做爲參數傳遞,不能做爲類型使用,另外它也是消息發送過程當中第一個默認參數
  • super 爲編譯器的一個關鍵字,告知編譯器在調用方法時從父類的方法表中尋找

2. block 修改捕獲變量除了用 __block 還能夠怎麼作?有哪些侷限性?

  • 將變量聲明爲全局的或利用static修飾
  • 也能夠把變量聲明爲類的成員變量或者屬性,訪問一樣不須要 __block

__block 修飾的局部變量會隨着 block 銷燬而銷燬,內存管理與 block 同步,全局/局部靜態/全局靜態,存在於程序的整個生命週期,成員變量的生命週期由其類控制安全

3. 什麼狀況使用 weak 關鍵字,相比 assign 有什麼不一樣?

(1)、什麼狀況下使用weak:

  • 在ARC中修飾代理
  • 使用@IBOutlet鏈接控件
  • 當block會形成循環引用

(2)、與assign的不一樣

assign能夠用於非對象類型,而weak必須用於對象類型atom


進階

區別

  • 修飾變量類型的區別
    weak 只能夠修飾對象。若是修飾基本數據類型,編譯器會報錯-「Property with ‘weak’ attribute must be of object type」。 assign 可修飾對象,和基本數據類型。當須要修飾對象類型時,MRC時代使用unsafe_unretained。固然,unsafe_unretained也可能產生野指針,因此它名字是"unsafe_」。代理

  • 是否產生野指針的區別
    weak 不會產生野指針問題。由於weak修飾的對象釋放後(引用計數器值爲0),指針會自動被置nil,以後再向該對象發消息也不會崩潰。 weak是安全的。 assign 若是修飾對象,會產生野指針問題;若是修飾基本數據類型則是安全的。修飾的對象釋放後,指針不會自動被置空,此時向對象發消息會崩潰。指針

類似

均可以修飾對象類型,可是assign修飾對象會存在問題。code

總結

assign 適用於基本數據類型如int,float,struct等值類型,不適用於引用類型。由於值類型會被放入棧中,遵循先進後出原則,由系統負責管理棧內存。而引用類型會被放入堆中,須要咱們本身手動管理內存或經過ARC管理。
對象

weak 適用於delegate和block等引用類型,不會致使野指針問題,也不會循環引用,比較安全。生命週期

4. weak屬性須要在dealloc中置nil麼?

在ARC中,不管是strong修飾的對象仍是weak修飾的對象,都再也不須要在dealloc中將對象置爲nil,編譯器會自動幫咱們處理,即便編譯器不幫助咱們處理,在屬性所指的對象遭到摧毀時,屬性值也會清空(nil out)。內存

5. ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?

  • 原子性 -- atomic
  • 讀寫權限 -- readwrite
  • 內存管理 -- 基礎數據類型(assign),對象(strong)
相關文章
相關標籤/搜索