天天看點

閉包

閉包和OC中的block非常相似注意:閉包和block一樣,第一次使用時可能不習慣它的文法,可以先按照使用簡單的閉包,随着學習的深入,慢慢掌握其靈活的運用方法.

OC中的block是匿名的函數

Swift中的閉包是一個特殊的函數

block和閉包都經常用于回調

定義網絡請求的類

進行網絡請求,請求到資料後利用block進行回調

block寫法總結:

進行網絡請求,請求到資料後利用閉包進行回調

閉包寫法總結:

如果閉包沒有參數,沒有傳回值.in和in之前的内容可以省略

尾随閉包寫法:

如果閉包是函數的最後一個參數,則可以将閉包寫在()後面

如果函數隻有一個參數,并且這個參數是閉包,那麼()可以不寫

如果在HttpTool中有對閉包進行強引用,則會形成循環引用

補充:在Swift中檢測一個對象是否銷毀,可以實作對象的<code>deinit</code>函數

循環引用的(實作)

該實作是為了産生循環引用,而産生的循環引用

swift中解決循環引用的方式

方案一:

使用weak,對目前控制器使用弱引用

但是因為self可能有值也可能沒有值,是以weakSelf是一個可選類型,在真正使用時可以對其強制解包(該處強制解包沒有問題,因為控制器一定存在,否則無法調用所在函數)

方案二:

和方案一類型,隻是書寫方式更加簡單

可以寫在閉包中,并且在閉包中用到的self都是弱引用

方案三:(常用)

使用關鍵字<code>unowned</code>

從行為上來說 unowned 更像OC中的 unsafe_unretained

unowned 表示:即使它原來引用的對象被釋放了,仍然會保持對被已經釋放了的對象的一個 "無效的" 引用,它不能是 Optional 值,也不會被指向 nil