Block類型是一個C級別的語法和運行機制。它與標准的C函數類似,不同之處在於,它除了有可執行代碼以外,它還包含了與堆、棧內存綁定的變量。因此,Block對象包含著一組狀態數據,這些數據在程序執行時用於對行為產生影響。
你可以用Block來寫一些可以傳到API中的函數語句,可選擇性地存儲,並可以使用多線程。作為一個回調,Block特別的有用,因為block既包含了回調期間的代碼,又包含了執行期間需要的數據。
由於Objective-C 和 C++ 都是衍生自C,block被設計為可同時兼容這三種語言。
今天主要來說說block訪問外部變量的一些東西!
在block內部可以使用外部變量
但是要注意,這是一個新的內存空間變量
block內部也可以定義和block外部的同名的變量(局部變量),此時局部變量會暫時屏蔽外部變量的作用域
非局部變量會以const變量被拷貝並存儲到block中,也就是說在block中是只讀的。如果嘗試在block內部給m變量賦值,會拋出編譯器錯誤。
凍結中的非局部變量是一個常量值,這也是一種默認的安全行為——因為這可以防止在block中的代碼對非局部變量做了意外的修改。
給局部變量加上__block
關鍵字,則這個局部變量可以在block內部進行修改。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20160408/20160408091645204.png" alt="\">
1、靜態變量和全局變量在加和不加__block
都會直接引用變量地址。也就意味著可以修改變量的值。在沒有加__block
關鍵字的情況下。
2、常量變量(NSString *a=@"hello";
a
為變量,@“hello”
為常量。)
不加__block
類型,block會直接取常量值(淺拷貝)。
加__block
類型,block會去引用變量的地址。(如:a變量,a = @"abc".可以任意修改a 指向的內容。)
如果不加__block
直接在block內部修改變量 ,會編譯報錯。block內部改變量是只讀的。