2013-05-01 37 views
3

內的參數,我知道我可以這樣定義塊屬性塊,像這樣:存儲與NSArray的

self.myProperty = ^(){ 
    // bla bla bla   
}; 

商店陣列上做

NSArray *arrayOfBlocks = [[NSArray alloc] initWithObject:[self.myProperty copy]]; 

然後執行它使用

void (^ myblock)() = [arrayOfBlocks objectAtIndex:0]; 
myblock(); 

但是如果塊有一個參數呢?

我的意思是,像塊這樣:

self.myProperty = ^(id myObject){ 
    // bla bla bla   
}; 

我想是能夠保持這種線不變什麼

void (^ myblock)() = [arrayOfBlocks objectAtIndex:0]; 
myblock(); 

// yes, I know I can replace myblock(); with myblock(object); 
// but because I have a large number of blocks on this array, I will have to build 
// a huge if if if if statements to see what block is being run and change the objects passed 

我想是塊與參數上存儲陣列...這樣的事情:

NSArray *arrayOfBlocks = [[NSArray alloc] initWithObject:[self.myProperty(object?) copy]]; 

這是可能的嗎?

回答

5

幸運的是,塊是一流的值。你可以使一個工廠方法返回一個將被某個對象調用的塊。

typedef void (^CallbackBlock)(void); 
- (CallbackBlock)callbackWithNumber:(int)n 
{ 
    return [^{ 
     NSLog(@"Block called with %d", n); 
    } copy]; 
} 

用法:

[mutableArray addObject:[self callbackWithNumber:42]]; 
[mutableArray addObject:[self callbackWithNumber:1337]]; 

// later: 
CallbackBlock cb = [mutableArray objectAtIndex:0]; 
cb(); 
+1

非常聰明的想法封裝參數和塊。這是黑魔法!謝謝! – SpaceDog 2013-05-02 18:44:30

+0

@RubberDuck歡迎您。是的,這是非常整潔的東西,我非常喜歡關閉;) – 2013-05-02 18:54:11

+0

嗨@ H2CO3 從callbackWithNumber返回它之前發送副本到塊時是否存在內存管理問題:? 該塊被添加到數組中,但它永遠不會被釋放!在這種情況下複製是否真的必要? – 2013-07-03 09:10:49