iOS block 聲明及使用

block 顧名思義就是代碼塊,將同一邏輯的代碼放在一個塊,使代碼更簡潔緊湊,易于閱讀,而且它比函數使用更方便,代碼更美觀,因而廣受開發者歡迎。但同時 block 也是 iOS 開發中坑最多的地方之一,因此有必要了解下 block 的實現原理,知其然,更知其所以然,才能從根本上避免挖坑和踩坑。

需要知道的是,block 只是 Objective-C 對閉包的實現,并不是 iOS 獨有的概念,在 C++、Java 等語言也有實現閉包,名稱不同而已。

Block屬性的聲明,首先需要用copy修飾符,因為只有copy后的Block才會在堆中,棧中的Block的生命周期是和棧綁定的

Block的定義格式

返回值類型(^block變量名)(形參列表) = ^(形參列表) {

};

調用Block保存的代碼

block變量名(實參);

typedefvoid(^BlockType)(int);

//聲明屬性

@property (copy) BlockType myBlock;?

@property (nonatomic, copy) ?void(^textBlock) (NSString*text); // 字符串回調

@property (nonatomic,copy)dispatch_block_t blockAction; // 點擊事件回調

回調值

__weaktypeof(self) weakSelf =self;

vc.v= ^(NSString*str){

weakSelf.textStr=str;

};

//有了atomic來保證基本的原子性還是沒有達到線程安全的,調用時需要把Block先賦值給本地變量,以防止Block突然改變。即便是先判斷了Block屬性不為空,在調用之前,一旦另一個線程把Block屬性設空了,程序就會crash:

if(self.myBlock)

{

self.myBlock(123);

}

//先判斷其是否為空,self.myBlock可能被另一個線程改為空,造成crash

//注意:atomic只會確保myBlock的原子性,這種操作本身還是非線程安全的

注:循環引用問題

在ARC下,由于__block抓取的變量一樣會被Block retain,所以必須用弱引用才可以解決循環引用問題

__weaktypeof(self) weakSelf =self;

self.myBlock= ^()

{

};

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • block 顧名思義就是代碼塊,將同一邏輯的代碼放在一個塊,使代碼更簡潔緊湊,易于閱讀,而且它比函數使用更方便,代...
    KAKA_move閱讀 459評論 0 0
  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現匿名函數的特性,B...
    smile刺客閱讀 2,375評論 2 26
  • Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數的傳遞等。用過GCD就知道Block的精妙之處。...
    Coder_JMicheal閱讀 739評論 2 1
  • 設計模式 1.delegate和notification什么區別,什么情況使用? 2.描述一下KVO和KVC。 K...
    丶逐漸閱讀 1,977評論 3 2
  • 1. Block的聲明和線程安全 Block屬性的聲明,首先需要用copy修飾符,因為只有copy后的Block才...
    win_coder閱讀 748評論 0 0