iOS開發——Block詳解

iOS開發——Block詳解


1. Block是什麼

  • 代碼塊
  • 匿名函數
  • 閉包——可以讀取其餘函數內部變量的函數
  • 函數變量
  • 實現基於指針和函數指針
  • 實現回調的機制

Block是一個很是有特點的語法,它能夠把一個代碼塊做爲一個變量來保存,也能夠經過函數傳遞變量,而後讓其餘的對象來執行這一代碼塊。能夠保存傳遞並在其餘地方執行的代碼塊,這是我對Block的理解,也是我以爲Block最吸引個人地方。ios

2. 怎麼寫Block

官方寫法

/**直接定義——返回Block指針
*   ^返回類型<可省略>(參數類型 參數)<沒有參數可省略>{
*   代碼塊;
*   };
*/
^int(int a){
    return a;
};
/**使用Block——返回Block返回值
 *  Block(參數)
 */
^int(int a){
    return a;
}(5);
/**聲明定義Block變量
 *  返回類型 (^變量名)(參數類型);
 */
int (^example)(int);
example = ^(int a){
    return a;
};

最建議寫法

/**類型聲明定義Block變量
 *  typedef 返回類型 (^Block名)(參數類型);
 */
typedef int (^Example)(int);
Example eg = ^(int a){
    return a;
};
eg(5);

3. Block存在的坑

  • 默認Block只能訪問局部變量的值,可是不能修改局部變量的值
  • 要修改局部變量的值須要在定義變量前面加上__block
  • 要修改局部對象的值須要在定義對象前面加上__weak
  • 全局變量的機制跟局部變量同樣,默認傳入時只會Copy源變量,對它修改不會起到任何做用,只有用__block或者__weak修飾的變量操做纔有意義
  • 塊是在棧上分佈的,若是要保留塊,就必須使用copy@property (nonamatic, copy) ABlock eg;
相關文章
相關標籤/搜索