【问题标题】:Passing an identical message to multiple ObjC classes将相同的消息传递给多个 ObjC 类
【发布时间】:2010-06-22 18:12:05
【问题描述】:

我有多个班级,我想向所有班级发送相同的消息。为了更清楚:

我要发送 doX:withClass: 具有相同参数的多个类。也许代码会让它更清晰:

+ (void)doX:(NSString *)blah {
     [Utility doX:blah withClass:[Foo class]];
     [Utility doX:blah withClass:[Bar class]];
     [Utility doX:blah withClass:[Baz class]];
     [Utility doX:blah withClass:[Garply class]];
}

我有三个方法,它们对实现特定协议的类执行类似的操作(doX:withClass: 方法执行许多步骤,假设给它的类实现了这样的协议)。

我的问题是,我怎样才能以编程方式循环遍历这些类,所以我可以简单地添加到一个列表(在代码中 - 对能够在运行时添加不感兴趣)以将其添加到循环中?

【问题讨论】:

    标签: objective-c loops message-passing class-method


    【解决方案1】:

    我的建议是传递 NSArrayClass 对象:

     [Utility doX:blah withClasses:[NSArray arrayWithObjects:[Foo class], [Bar class], [Baz class], [Garply class], nil]];
    
     -(void) doX:(Blah) blah withClasses:(NSArray *) classes {
          //[classes makeObjectsPerformSelector:@selector(doX:) withObject:blah]
          for(Class *someClass in classes) {
             [Utility doX:blah withClass:someClass]; 
          }
    }
    

    【讨论】:

    • 您可以将正文更改为[classes makeObjectsPerformSelector:@selector(doX:) withObject:blah]
    • 好吧,我不希望类执行选择器;我希望 Utility 类以 Class 作为参数运行方法。这是因为它所操作的对象需要保持简单并从我希望 Utility 类在实现该特定接口的类上执行的行为中抽象出来。不过,谢谢——我没有意识到类可以直接添加到数组中;我认为它们必须以某种方式封装。
    【解决方案2】:

    不确定你真的想在这里循环。

    如果是我,我可能会尝试让 Foo、Bar、Baz 和 Garply 来扩展一些定义 doX 的基类。然后你可以让你的基类观察 blah 并在它发生变化时调用 doX。但也许我不明白你要做什么。

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2012-12-31
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多