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 = @"block 會拷貝變數內容到自己的棧記憶體上,以便執行時可以呼叫。 但並不是對str 內容做了深拷貝,重新申請記憶體。hello";
void (^print)(void) = ^
str = @"
hello1";
print();
因為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 變數,編譯器也會報錯。那麼該如何修改外部變數呢?有兩種辦法,第一種是可以修改...