我对使用积木很陌生。我想知道是否有一种方法可以动态地将代码添加到块中?如果你愿意的话,一个可变的街区。
最佳答案
这听起来不像你想要的那样,但是如果不是完全相同的话,它会得到一个类似的结果:在外部块中有一个__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
变量读取时,才需要复制块以确保它不再在堆栈上。关于objective-c - 添加代码以动态阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14076145/