iOS 對於block的理解

 Block是一種數據類型,C語言中的匿名函數,能夠被當作參數和返回值傳遞,它是提早準備好的能工做的代碼單元,能夠在任何須要的時候被執行。
       特地小結了下對 block 的一些理解,以下:
程序員

       1、默認狀況下,咱們不容許在 block 代碼塊內部修改外部變量的數值。若是要修改外部定義的變量,咱們須要使用__block 關鍵字進行修飾。函數

       2、使用Block傳值時要防止循環引用。
             例如:在一個控制器中,self強指針指向一個對象,這個對象又強指針指向一個 block,在這個 block 的代碼塊中有一個 self. ,那麼就會形成循環引用,從而致使內存沒法釋放,形成內存泄露。
            解決方法:只要打斷其中一條強引用。
                  通常在ARC狀況下,一般用 __weak 修飾 block 中的 self. ,從而打斷強引用。例如:__weak typeof(self)weakSelf = self ,用 weakSelf 來指向 self 的內存地址,使得 self 在 block 中使用時變成一個弱指針,從而打斷循環引用。
                 在MRC狀況下,用 __unsafe__unretained 來打斷強引用,可是 __unsafe__unretained 是 「assign」 形式,若是指向的對象被釋放,其指針地址仍是存在的保存不變,若是繼續使用該指針,就會出現「野指針」現象。
spa

           因此當Block內引用局部變量時,在MRC環境下咱們使用 __block,ARC環境下要用 __weak 修飾此變量來解除循環引用。指針

      3、block 的內存管理問題。
             當 block 是一個變量時,在ARC運行環境下,有如下幾點特性:
                1.block沒有使用外部變量時,保存在全局區;
                2.使用了外部變量,會保存在堆區。
            MRC運行環境下的特性:
               1.定義block:保存在棧區;
               2.若須要使用 Block_copy 操做時,會把block複製到堆區;
               3.block使用完成以後,須要使用 Block_release 釋放block;
orm

               4.若是沒有使用外部變量(這種狀況極少),一樣保存在全局區。對象


關於棧區、堆區的特色:
內存

       棧區:主要存放局部變量,定義的參數等,在函數結束時,系統會自動回收它的內存空間。 特色:方便快捷。it

       堆區:是由程序員自行管理的內存地址,程序結束時,若是內存地址沒有釋放徹底,則由系統回收。特色:靈活。內存管理

相關文章
相關標籤/搜索