訪問變數
1、可以讀取和block pointer同乙個scope的變數值:
[cpp]view plain
copy
; //block裡面可以讀取同一型別的outa的值
intresult = myptr(3);
// result is 11
nslog(@"result=%d"
, result);
}
下面來看一段很有意思的**:
[cpp]view plain
copy
; //block裡面可以讀取同一型別的outa的值
outa = 5; //在呼叫myptr之前改變outa的值
intresult = myptr(3);
// result的值仍然是11,並不是8
nslog(@"result=%d"
, result);
}
為什麼result 的值仍然是11?而不是8呢?事實上,myptr在其主體中用到的outa這個變數值的時候做了乙個copy
的動作,把outa的值copy下來。所以,之後outa即使換成了新的值,對於myptr裡面copy的值是沒有影響的。
需要注意的是,這裡copy的值是變數的值,如果它是乙個記憶體的位置(位址),換句話說,就是這個變數是個指標的話,
它的值是可以在block裡被改變的。如下例子:
[cpp]view plain
copy
(5);
nslog(@"test array :%@"
, mutablearray);
}
原本mutablearray的值是,在block裡面被更改mutablearray後,就變成了。
2、直接訪問static型別的變數
[cpp]view plain
copy
; outa = 5;
intresult = myptr(3);
//result的值是8,因為outa是static型別的變數
nslog(@"result=%d"
, result);
}
甚至可以直接在block裡面修改outa的值,例如下面的寫法:
[cpp]view plain
copy
; int
result = myptr(3);
//result的值是8,因為outa是static型別的變數
nslog(@"result=%d"
, result);
}
3、block variable型別的變數
在某個變數前面如果加上修飾字「_
_block」的話(注意,block前面有兩個下劃線),這個變數就稱作block variable。
那麼在block裡面就可以任意修改此變數的值,如下**:
[cpp]view plain
copy
; int
(^myptr2)(
int) = ^(
inta);
intresult = myptr(0);
//result的值為5,num的值為6
result = myptr2(0); //result的值為6,num的值為7
nslog(@"result=%d"
, result);
}
因為myptr和myptr2都有用到num這個block variable,最終num的值為7.
未完待續。。
Block筆記 2 Block變數
c語言中可以使用函式指標來指向乙個函式,通過函式指標來間接的呼叫乙個函式。c函式指標形式如下 c 1 2 3 4 5 6 7 8 9 10 11 定義乙個函式 intfun intt 宣告乙個函式指標,並指向定義的fun函式 int funcptr int fun 呼叫,通過函式指標來間接的呼叫fu...
block用法小計
預設情況下,任何block都是在棧中,隨時可能會被 對block設定copy屬性,block的記憶體就會放到堆裡面。book b book alloc init b.block 如果像上述寫法block所指向的 塊會強引用book的記憶體位址,使得book物件不能釋放,造成記憶體洩露。book b ...
block 基本用法
專門處理 需要重複呼叫的 block 返回值相同,引數相同 在.h檔案中,宣告 typedef void typedefblock nsstring typedef int typedefbock2 inta,intb ibaction testaction id sender oc語言 self ...