2013-05-01 38 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