
Block 與 Operation Queue
|
93
要解決這個問題,如果你希望 block 在函式返回之後繼續存在,就必須將這個 block
複
製
到堆積。為了做到這件事,你必須傳送
copy
訊息給 block,方法就如同你傳送訊息給
任何其他 Objective-C 物件。一旦 block 被複製到堆積,它便能夠安全地被儲存到任何
地方。當然,它之後必須被取消配置(deallocated),以避免記憶體滲漏的問題發生,
不過,垃圾收集器(garbage collector)與自動參考計數(ARC,Automatic Reference
Counting)會幫你處理這項工作。
下面例子說明如何將 block 儲存為實例變數,以及如何不要︰
// myBlockProperty 是這個類別當中用來存放該 block 的特性。
void(^myBlockVariable)() = ^{
// 程式碼在此
};
self.myBlockProperty = myBlockVariable; // 不正確!該 block
// 在函式返回後不復存在,呼叫它會發生程式失敗。
self.myBlockProperty = [myBlockVariable copy]; // 安全。該 block
// 會被複製並且儲存在堆積中,並且繼續存在。
具有 block 參數的方法
方法可以接受 block 參數。這實際上是 block 的關鍵功能之一,因為這樣允許方法呼叫
者在它們呼叫方法時即時提供程式碼。我們已經知道這如何被用來過濾陣列,但還有其 ...