2012-12-28 67 views
0

我很新使用塊。我想知道是否有辦法將代碼動態添加到塊中?如果你願意的話,一個可變的塊。添加代碼來動態阻止

+0

不完全。但是,如果你願意,你可以嘗試嵌入腳本引擎,JavaScript核心或Lua是好的。 – 2012-12-28 21:42:08

+0

動態製作封閉不是很容易... – CodaFi

+0

無賴:-(...... –

回答

3

這聽起來像是你想要的,但是如果不是完全相同的結果,它會得到相似的結果:從外部塊中順序調用__block NSMutableArray塊。

是一個愚蠢的演示:

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     __block NSMutableArray *subblocks = [NSMutableArray array]; 

     void (^blockWithBlocks)(void) = ^{ 
      NSLog(@"%s: in blockWithBlocks()", __PRETTY_FUNCTION__); 

      for (void (^subblock)(void) in subblocks) { 
       subblock(); 
      } 
     }; 

     for (int i = 0; i < 3; i++) { 
      void (^subblock)(void) = ^{ 
       NSLog(@"%s: in subblock %d", __PRETTY_FUNCTION__, i); 
      }; 
      [subblocks addObject:subblock]; 
     } 

     blockWithBlocks(); 

    } 

    return 0; 
} 

注意,對於ARC下複製塊的要求一直在不斷變化。以前它會一直需要編寫[subblocks addObject:[subblock copy]];而不是簡單地[subblocks addObject:subblock];the clang documentation

描述進行,除了當前的語義保留作爲初始化__strong參數變量或閱讀__weak變量的一部分,每當這些語義調用來完成爲了保留塊指針類型的值,它具有Block_copy的效果。優化程序可能會在看到結果僅用作調用參數時刪除這些副本。

唯一倍,這是必要的複製塊,以確保它是在堆棧上不再是當塊被作爲參數傳遞給函數/方法具有__strong參數可變,並通過當該塊正在從__weak變量中讀取時。

+1

當然,我可以考慮去做它的最佳方式。+1 – CodaFi

0

你是什麼意思「動態添加代碼到塊」?這與從「代碼」和原始塊中簡單地創建新塊有什麼不同?

如果不同之處在於您想要引用塊並且其行爲發生更改而不必爲該引用分配新塊,則可以使塊捕獲可變狀態,其中可變狀態可能包含要調用的塊,然後你可以改變,就像@NateChandler所建議的那樣。

如果不同之處在於您可以在幾個不同的「代碼」之間進行選擇,因此您無法在創建塊的位置對其進行硬編碼,那麼您只需製作「代碼段」成塊,並選擇正確的塊放入新的塊。