【问题标题】:Is its ok to have multiple implementations per target in XCode?在 XCode 中每个目标有多个实现可以吗?
【发布时间】:2013-09-03 16:21:59
【问题描述】:

我有一个定义类接口的头文件:

// MyClass.h - included in all targets
//
@interface MyClass
+ (void) doThing;
@end

我有两个不同的实现文件 - 每个目标一个。

// MyClass+targetA.m - Only included in targetA
//
@implementation MyClass
+ (void) doThing { NSLog(@"targetA"); }
@end


// MyClass+targetB.m - Only included in targetB
//
@implementation MyClass
+ (void) doThing { NSLog(@"targetB"); }
@end
  • 这种方法有问题吗?
  • 是否有更好或更简单的方法来自定义每个目标的行为?

MyClass 方法将用于主题化应用程序的外观。 MyClass 上会有几个方法和几个目标

【问题讨论】:

  • 这两个实现是否有很大的不同,以至于它们有理由放在不同的源文件中?如果没有,基于特定目标预处理器定义的#ifdef 可能是更好的选择。如果您决定保留两个文件,我建议更改它们的名称。当两个文件具有相同的名称时,我看到 Xcode 会感到困惑(构建良好,但有时会在编辑器中显示错误的文件)。
  • @mah - 有趣!感谢您的答复。我曾经使用过预处理器定义,因为我过去也使用过它们。该实现是为不同客户的应用程序主题化,因此实现之间有相当多的变化。关于更改名称的重要提示 - 我认为这是可能的。
  • 类名和源文件名之间没有联系,所以绝对有可能——但最好以一种合理的方式命名它们……例如 MyClass_client1.m、MyClass_client2.m、等等

标签: iphone ios objective-c


【解决方案1】:

是的,这会很好,我也采用了类似的方法,除了我使用了条件编译,一个目标公开私有功能,另一个目标公开公共功能,但所有目标共享同一组源文件。

但是我们两种方法的结果是一样的。

【讨论】:

  • 感谢您的回答!我不太明白您所说的“目标公开私有功能和另一个目标公开公共功能”是什么意思。听起来很有趣,你能解释一下吗?
  • @Robert 只是我想向公众提供一个功能有限的静态库,所以我在编译期间使用一个常量来控制私有和公共构建的内容。
【解决方案2】:

所以我实际上更喜欢在目标设置中设置OTHER_CFLAGS,并为其中之一设置我的自定义标志,如TARGET_FREE。然后在源代码中我可以写如下内容:

@implementation MyClass
+ (void) doThing {

#ifdef TARGET_FREE 
    // Code for one target
#else
    // Code for another
#endif

}
@end

【讨论】:

  • 是的,我过去曾使用过它,并且效果很好。问题在于MyClass 的复杂性。它上面有大约 20 种方法(它用于为不同客户端设置模板应用程序主题)。如果以这种方式实现,我会看到随着目标和方法数量的增加,代码会变得更加复杂。
  • 好的。我懂了。因此,至少它会按应有的方式编译和工作。可能是您在编辑相关代码时可能会在 xcode 中遇到一些导航或代码感知问题但不确定。
  • 是的,确认从标题到源的快捷导航已损坏。我接受了 trojanfoe 的建议并重命名了每个 .m 文件。我想我可以忍受这一点
  • 当您的常量可以进入构建设置的普通宏部分时,为什么还要使用OTHER_CFLAGS
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2017-08-11
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多