2012-04-05 18 views
9

我對塊有點新,需要一些幫助。我想在NSDictionary中存儲一個塊,並在基於其key訪問時執行所述塊。這是我迄今爲止的一個例子。如何執行存儲在NSDictionary中的塊?

NSDictionary *blocks = [NSDictionary dictionaryWithObjectsAndKeys: 
           ^{NSLog(@"Log Block 1");}, @"Block1", 
           ^{NSLog(@"Log Block 2");}, @"Block2", 
           nil]; 

然後我通過使用keyEnumerator來列舉字典。我知道這個塊被正確存儲,因爲我在枚舉過程中調用了NSLog(@"%@", [blocks objectForKey:key]);,並得到了<__NSGlobalBlock__: 0x100003750>。所以我知道我可以訪問它,但是我現在如何執行它?

回答

15

試試這個:

void(^myAwesomeBlock)() = [blocks objectForKey:key]; 
myAwesomeBlock(); 
+0

謝謝,這對我很有用。不過,我注意到,當對每個塊進行後續調用時,它將返回與第一次執行時相同的信息,而不是包含自此以後可能已更改的任何內容。有沒有辦法讓它在每次被調用時執行而不是返回原始信息? – sud0 2012-04-13 00:00:36

+2

它每次都會執行,但它會在複製時捕獲外部變量,而不是在執行時進行捕獲。 – 2013-08-20 04:53:35

0

你需要轉換:

id bar = [blocks objectForKey:@"Block1"]; 
((void(^)())bar)(); 
4

我注意到,雖然,當隨後調用每個塊使其返回相同的信息時,它是第一次執行,而不是包括任何可能改變的事情。有沒有辦法讓它在每次被調用時執行而不是返回原始信息?

參見關於塊的文件,特別是部分題爲Types of Variable

以下規則適用於一個塊中使用的變量:

  • 棧(非靜態)封閉詞法作用域的本地變量被捕獲爲const變量。

    它們的值取自程序中塊表達式的位置。在嵌套塊中,該值是從最近的封閉範圍捕獲的。

  • __block存儲修飾符聲明的封閉詞法範圍的局部變量由引用提供,因此可以修改。

    任何更改都反映在封閉詞法作用域中,包括在同一個封閉詞法作用域內定義的任何其他塊。這些在「__block存儲類型」中有更詳細的討論。

相關問題