在XCode中,一个目标是否可以有多个实现?

5

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

// 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上将有几种方法和几个目标。


2
这两个实现是否如此不同,以至于它们有正当理由放在不同的源文件中?如果不是,基于特定目标的预处理器定义的#ifdef可能是更好的选择。如果您决定保留两个文件,我建议更改它们的名称。我曾经看到Xcode混淆了两个具有相同名称的文件(构建良好,但有时在编辑器中显示错误的文件)。 - mah
@mah - 很有趣!感谢您的回复。我曾经考虑过使用预处理器定义,因为我以前也用过它们。这个实现是为了为不同的客户主题化应用程序,因此在实现之间有相当大的差异。关于更改名称的提示很棒 - 我没有想到这是可能的。 - Robert
类名和源文件名之间没有连接,因此肯定是可能的 - 但最好以有意义的方式命名它们...例如:MyClass_client1.m,MyClass_client2.m等。 - mah
2个回答

1
所以我更喜欢在目标设置中使用自定义标志,如TARGET_FREE来设置OTHER_CFLAGS。然后在源代码中,我可以这样写:
@implementation MyClass
+ (void) doThing {

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

}
@end

是的,我以前用过这个方法,它运行得很好。问题在于 MyClass 的复杂性。它有大约20个方法(用于为不同客户端主题化模板应用程序)。如果按照这种方式实现,随着目标和方法数量的增加,我会看到代码变得更加复杂。 - Robert
好的,我明白了。所以至少它会编译并按照预期工作。也许在编辑相关代码时,您可能会遇到一些导航或代码感知问题,但不确定。 - Skie
是的,确认从标题到源代码的快捷导航已经失效了。我采纳了trojanfoe的建议并重命名了每个.m文件。虽然我认为我可以接受这种情况。 - Robert
为什么你的常量可以放在构建设置的普通宏区域,但你还要使用OTHER_CFLAGS - trojanfoe

1

是的,那样做很好,我也采取了类似的方法,但我使用了条件编译,其中一个目标公开私有功能,另一个目标公开公共功能,但所有目标都共享相同的源文件。

然而,我们两种方法的结果是相同的。


谢谢你的回答!我不太明白你所说的“目标暴露私有功能和另一个目标暴露公共功能”的意思。听起来很有趣,你能详细解释一下吗? - Robert
@Robert,我的意思很简单,我想向公众提供一个具有有限功能的静态库,因此我在编译期间使用常量来控制私有和公共版本的内容。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接