閉包和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