block 對外部引用變數的處理

2021-07-08 21:14:06 字數 856 閱讀 9161

mrc 環境

一、靜態變數 和 全域性變數   在加和不加  __block 都會直接引用變數位址。也就意味著 可以修改變數的值。在沒有加__block 引數的情況下。

二, 常量變數(nsstring *a = @"hello";a 為常量變數,@「hello」為常量。)-----不加__block型別 block 會引用常量的位址(淺拷貝)。加__block型別 block會去引用常量變數(如:a變數,a = @"abc".可以任意修改a 指向的內容。)的位址。 

如果不加__block 直接在block 內部修改變數 ,會編譯報錯。block 內部改變量是 唯讀的。

但是 就一定可以推斷  block 會深拷貝 該變數嗎??? 

對於常量 @「hello」  儲存在 記憶體中的常量區, 程式結束才會釋放 記憶體。  如:

nsstring*str = @"hello";

nsstring*abcstr = @"hello";

編譯器會優化處理, str 和 abcstr 都會指向 常量區的@「hello」 位址。

nsstring *str = @"

hello";

void (^print)(void) = ^

str = @"

hello1";

print();

block 會拷貝變數內容到自己的棧記憶體上,以便執行時可以呼叫。 但並不是對str 內容做了深拷貝,重新申請記憶體。

因為str 是棧記憶體上的變數,指向 乙個常量區的@「hello」. 編譯器做的優化是   當block 去拷貝str 指向內容時發現是個常量,

所以會去引用 @「hello」 的指標,沒必要再取申請一塊記憶體。

轉至於 

使用 getJSON對外部變數進行賦值

淘淘專案中商品資訊和商品類目分別採用tb item和tb item cat兩張表進行儲存,而在service層進行查詢時採用的是單錶查詢,只能查詢出商品類目的id,在easyui的表單中顯示效果就有些不直觀。檢視資料庫表tb item的結構,其中的status的型別為tinyint,但是表單中的形式...

shell awk引用外部變數

在使用awk的過程中,經常會需要引用外部變數,但是awk需要使用單引號將print包起來,導致print後的 引用無效,可以採用下面的方式 例如 bin bash a line1 line2 line3 for i 1 i 3 i doecho a awk done 上面這個指令碼執行的時候,會輸出...

如何在 block 中修改外部變數

lock 的目的是為了支援並行程式設計,對於普通的 local 變數,我們就不能在 block 裡面隨意修改 原因很簡單,block 可以被多個執行緒並行執行,會有問題的 而且如果你在 block 中修改普通的 local 變數,編譯器也會報錯。那麼該如何修改外部變數呢?有兩種辦法,第一種是可以修改...