Objective-C:如何构建命令调度表? [重复]

问题描述 投票:0回答:1

我正在使用 ARC 在 Objective-C 中构建命令调度表。

这个表格看起来不错还是有更好的选择:

self.commandTable = [
    @{
        @"command1" : ^(id value) { return [self runCommand1:value]; },
        @"command2" : ^(id value) { return [self runCommand2:value]; },
     } mutableCopy  ];
objective-c nsdictionary objective-c-blocks dispatch
1个回答
1
投票

我发现您的代码至少有两个问题。

首先,当您将基于堆栈的块(如您在代码中定义的两个)传递给集合时,它们不会自动保留。因此,当您想要执行该块时,您的应用程序很可能会崩溃。 @Josh 在评论中指出的问题的答案很好地解释了这一点:Block 在 NSDictionary (ARC) 中被释放。您应该在块上使用复制方法来创建可由 ARC 保留的基于堆的副本。

其次,插入复制方法后,您将有一个保留周期。你的对象“self”保留commandTable字典,字典将保留你的块(这是你的意图,你不希望你的块消失),并且当你在块中使用相同的对象“self”时,你的块将保留你的“自我”对象。为了避免这种情况,请为您的“self”对象定义一个 __weak 局部变量,如文档的使用块章节中所述:

MyClass* __weak weakSelf = self;
self.commandTable = [@{
                     @"command1" : ^(id value) { return [weakSelf runCommand1:value]; },
                     @"command2" : ^(id value) { return [weakSelf runCommand2:value]; },
                  } mutableCopy];

否则你的模式可能会很好地完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.