Objective c 目标C:如何建立指挥调度表?

Objective c 目标C:如何建立指挥调度表?,objective-c,nsdictionary,objective-c-blocks,dispatch,Objective C,Nsdictionary,Objective C Blocks,Dispatch,我正在使用ARC在Objective-C中构建一个命令调度表。 我在下面使用的表格看起来不错还是有更好的选择 例如: 我发现您的代码至少有两个问题 首先,基于堆栈的块(如代码中定义的两个)在传递给集合时不会自动保留。因此,当你想要执行块时,你的应用程序很可能会崩溃。这在@Josh在评论中指出的问题的答案中得到了很好的解释:。您应该在块上使用copy方法来创建可由ARC保留的基于堆的副本 其次,在插入复制方法后,将有一个保留周期。对象“self”保留可命令字典,字典将保留块(这是您的意图,您不希望

我正在使用ARC在Objective-C中构建一个命令调度表。 我在下面使用的表格看起来不错还是有更好的选择

例如:


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

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

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

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

否则,您的模式可能会做得很好。

谢谢,编辑的问题。根据CLang的规范,“instancetype是一个上下文关键字,只允许在Objective-C方法的结果类型中使用”(来源:)我不知道一些编译器是否在这个问题上更宽容,允许您在其他地方也使用instancetype,但我不会太依赖它。您是对的-似乎他们从关键字首次引入以来就改变了它的行为。我的错误,这些东西移动得太快了。@MrTJ如果上面的块被保存到属性(非原子,复制)id(^cmd)(id值);我可以在字典中使用self.cmd吗?还是我仍然需要[self.cmd copy]?复制属性将为您执行“复制”,因此您无需再次复制它。仍然要注意引用循环,这是泄漏内存的一种非常可靠的方法。
MyClass* __weak weakSelf = self;
self.commandTable = [@{
                     @"command1" : ^(id value) { return [weakSelf runCommand1:value]; },
                     @"command2" : ^(id value) { return [weakSelf runCommand2:value]; },
                  } mutableCopy];