我对使用积木很陌生。我想知道是否有一种方法可以动态地将代码添加到块中?如果你愿意的话,一个可变的街区。

最佳答案

这听起来不像你想要的那样,但是如果不是完全相同的话,它会得到一个类似的结果:在外部块中有一个__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/

10-11 16:42