我很擅长使用积木。我想知道是否有办法动态地向代码块添加代码?如果你愿意的话可变的块。
答案 0 :(得分:4)
这听起来并不像你想要的那样,但如果不完全相同,它会获得类似的结果:从外部块中顺序调用__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下复制块的要求一直在变化。以前,有必要在the clang documentation
中描述的当前语义下编写[subblocks addObject:[subblock copy]];
而不是简单地[subblocks addObject:subblock];
除了在初始化__strong参数变量或读取__weak变量时完成的保留外,每当这些语义要求保留块指针类型的值时,它都具有Block_copy的效果。当优化器看到结果仅用作调用的参数时,可以删除此类副本。
唯一需要复制块以确保它不再在堆栈上的时候是将块作为参数传递给具有__strong
参数变量的函数/方法当从__weak
变量中读取块时。
答案 1 :(得分:0)
你是什么意思“动态地向代码添加代码”?这与仅仅从“代码”和原始块中创建新块有何不同?
如果区别在于您希望对块进行引用并且在不必为该引用分配新块的情况下更改其行为,则可以使块捕获可变状态,其中可变状态可以包含要调用的块,然后可以更改,就像@NateChandler建议的那样。
如果不同之处在于您可以在几个不同的“代码”之间进行选择,那么您无法在创建块的位置对其进行硬编码,那么您可以将“代码片段”变为阻止并选择要放入新块的正确块。