Block的使用 初探Block

2021-09-07 12:27:53 字數 2144 閱讀 5445

看了兩天的block。

網上是有非常多解說與教程,也有講得非常好的。這裡就主要解說下我的理解與收穫。歡迎拍磚。

所謂block。我覺得應該是乙個閉包函式。而閉包,就是說block以及內部全部的變數生命週期都在其呼叫函式的生命週期內。

它一被呼叫完畢,則會被立刻釋放。這裡不講執行機制,僅僅簡要地講基本的用法(這裡所講是基於arc的環境下)。

1、放在函式體內的block:生命週期:僅僅存在於函式體。與函式體內的區域性變數相似。

其定義方式跟函式還是非常相似的。為了簡便理解我們對照下block與函式的定義。先看一下最簡單的形式,無返回值帶參。先看block直接放在函式體內的形式:
函式:

- (void)printblock:(nsstring *)output
block直接放在函式體內的形式:

void(^printblock)(nsstring *) = ^(nsstring *output)

;

這裡能夠看到。我們的函式體一般形式是:

- (返回值) 函式名: (形參)...
呼叫形式是:[呼叫物件 函式名(形參)];

那我們放在函式體內的block定義則是:

返回值 (^ block名)( 形參 ) = ^( 形參 );
呼叫形式是 :block名(形參)。

這裡的block就相當於是乙個內嵌函式。

宣告與實現要同一時候放在一起。形式就非常像我們尋常使用的物件賦值一樣:id obj = ... ;

2、放在函式外的block。

即為類內部範圍內的全域性block。生命週期為整個類內部。

定義與用法都與上面一致,僅僅只是就像區域性變數與類變數一樣是否可被其它方法呼叫而已。為了更簡單明瞭我們能夠看一下這個**:
//普通方法定義

- (void)printblock:(nsstring *)output

//函式體外的block

void(^printblock)(nsstring *) = ^(nsstring *output)

;//block呼叫

- (void)printsomething

3、放在類定義標頭檔案的block。

可被例項物件擁有。生命週期為整個例項物件。

標頭檔案裡的定義(1):

typedef

void(^printblockclass)(nsstring *);

@inte***ce

blockclass : nsobject

@property (nonatomic, copy)printblockclass print;

@end

//或者在實現檔案裡:

//但這樣的實如今內部的block我也不知道有什麼卵用。實際應用不大。

@inte***ce

blockclass : nsobject

@end

標頭檔案裡的定義(2):

//與方式一的差別無非像是自己定義一種結構然後你再去使用一樣

@inte***ce

blockclass : nsobject

@property (nonatomic, copy) void(^printblockclass)(nssting *output);

@end

這樣的把block作為屬性的情況是比較多用於頁面傳值中。
關於block的使用另一下幾個注意點: 1、僅僅有在呼叫block的時候才會執行{}內部的**(就比方把block定義在函式體內不呼叫是不會執行的)。

2、在block的{}內部**中是對外部的變數能夠引用,但不能改變。假設試圖更改會產生乙個編譯器錯誤。除非你把想要更改的變數宣告時加上 __block關鍵字。 3、在block使用過程要注意不要產生迴圈引用。

關於迴圈引用(memory recycle)這裡有一篇文章寫得不錯。有興趣能夠看看:

ios學習之block初探

block是ios4.0 和mac osx 10.6以後引進的對c語言的拓展,用來實現匿名函式的特性。所謂匿名函式,也稱閉包函式。即同意建立乙個暫時的沒有指定名稱的函式。最經經常使用作 函式 callback 引數的值,當然也有其它使用方法。比方說作為乙個變數值來使用,詳細使用方法將在後面介紹。在i...

block初級使用

view類中 mainview.h typedef 這個是重新定義,typeof 是求型別 typedef void registerblock nsstring 定義 block property nonatomic strong registerblock registerblock mainv...

iOS storyBoard使用Block傳值

1.在方法裡面定義的block是儲存在棧區的,方法呼叫完畢之後block占用的記憶體就會被銷毀.如果需要在其他方法裡面使用該block需要把block定義成屬性,修飾成copy,這樣 就會把棧區的內容拷貝乙份到堆區.2.解決block的記憶體迴圈引用問題.當乙個物件對block持有所有權.在bloc...