1

我将我的 Xcode 项目编译为两个目标,为了简单起见,我们将它们称为“Foo”和“Bar”。我有一个超类和两个子类,我怎样才能干净地确保一个变量根据项目目标作为不同的子类返回?

例如,假设我有以下...

ViewManager.h //Super Class
FooViewManager.h //Foo Subclass
BarViewManager.h //Bar Subclass

...

ViewManager * viewManager;

#if Target_Foo

    viewManager = [[FooViewManager alloc] init];

#elif Target_Bar

    viewManager = [[BarViewManager alloc] init];

#else

    viewManager = [[ViewManager alloc] init];

#endif

...

有什么办法可以让这段代码更干净,所以在调用者类中我不需要所有的编译器#if语句,我只需要初始化超类,也许超类的init方法可以根据当前项目目标进行切换,并在我的viewManager变量中返回正确的子类?

我确信在我缺少的 Objective-C 中可能有一个标准模式,但任何帮助将不胜感激!

4

2 回答 2

2

可以在一个地方找到所需的子类定义,即,您可以定义一次并在所有地方使用它:

#if defined(Target_Foo)
    #define CurrentViewManager FooViewManager
#elif defined(Target_Bar)
    #define CurrentViewManager BarViewManager
#else
    #define CurrentViewManager ViewManager
#endif

然后在没有预处理器宏的情况下在任何地方使用这个新定义:

CurrentViewManager *manager = [[CurrentViewManager alloc] init];

可能您发现在某些结构方法中封装此逻辑很有用:

+ (ViewManager *)createViewManager
{
    // Preprocessor switches would be here
    // ...

    return [[CurrentViewManager alloc] init];
}
于 2013-07-31T12:39:26.413 回答
1

您可以创建 2 个同名的类并将 m 个资源文件分配给不同的目标。这样你可以在 h 文件中声明一个通用类型,但在后台编译器将使用 2 个不同的源文件来实现它。

于 2013-07-31T12:25:28.913 回答