
Block 與 Operation Queue
|
95
Block 與記憶體管理
上面討論到 block 如何捕捉到它們所參照之變數的值。不過,Objective-C 物件太大,以
致於不能夠以值的方式被複製進來,而且單純捕捉指向其記憶體的指標並不安全。為了
解決這個問題,每當你在 block 裡參照 Objective-C 物件時,它會被該 block 保留起來,
並且在 block 被釋放時跟著被釋放,這使得該物件可以存續得跟該 block 一樣久,並且
保證該 block 總是能夠安全地被呼叫,因為它所參照的物件還存在於記憶體當中。
使用 __block 從 Block 內部修改本地變數
當你在 block 裡使用定義在該 block 以外的變數時,你可以隨心所欲地存取該變數的
值。對物件來說,該變數被保留(retain),對非物件來說,該變數裡的資料在建立該
block 時被複製到 block 裡。
不過,有時候,對 block 來說,能夠修改定義在它外面的變數是很有用的。當你想要這
麼做時,使用
__block
關鍵字標示該變數,這讓你能夠在該 block 裡修改這個變數。
例如,這段程式碼不會像你預期得那樣運作︰
int i = 0;
void(^myBlock)() = ^{
i = 4;
};
myBlock();
NSLog(@"i is now %i", i);// 會印出 "0"
要修正它,你必須這樣做︰
__block int i = 0;
void(^myBlock)() = ^{
i = 4; ...