在xcode / objective-c中共享项目之间的类

时间:2010-01-24 08:11:21

标签: objective-c xcode macos sharing

我有一个客户端< =>服务器应用程序我正在为Mac OS X构建,使用Objective-c / Cocoa和xCode。我为这两个应用程序创建了一个不同的项目,我想知道在它们之间共享类的最佳方法。我已经制作了几个对两者都有用的课程。到目前为止,我一直在复制它们,但我觉得这不是最好的解决方案。

如何有效地分享课程? 我应该将其重做为1个项目并且只有两个构建目标吗?我该怎么做?

还有其他信息吗?

感谢。

6 个答案:

答案 0 :(得分:13)

如果您有两个或更多产品要共享大量公共代码,例如一套产品,您可能需要考虑只创建一个xcode项目,然后为每个产品添加不同的目标将使用共享和特定于产品的代码构建。使用大量共享代码,客户端/服务器对产品可能是这种方式的绝佳选择。

简化,基本的协议是,对于您要构建的xcode项目中的每个目标,您可以指定应该使用哪些文件来构建它:源文件,art,xib等。这样,例如,您可以使用文件A,B,C,D,E,F和要使用文件A,F,X,Y,Z构建的服务器产品来设置要构建的客户端产品。

我真的很喜欢将每个相关产品都放在一个xcode项目的“屋顶”下,因为你不必跳过xcode项目,它真的简化了共享文件的SCM管理。

这是Apple的文档链接:https://developer.apple.com/library/mac/#featuredarticles/XcodeConcepts/Concept-Targets.html

更新:在xcode中配置特定于目标的头文件时会有一些额外的麻烦(它始终是......对吗?!);例如,对此目标使用“myHeaderA.h”,对该目标使用“myHeaderB.h”。这是一篇很棒的帖子,分享了如何做到这一点:controlling which project header file Xcode will include。警告:以这种方式设置后,xcode不再知道搜索任何目标头文件的任何路径,因此您必须手动设置它们。要执行此操作,请右键单击目标上的“获取信息”,选择“构建”类别,然后通过“标题搜索路径”设置添加路径。将按您输入的顺序搜索路径。

答案 1 :(得分:12)

一个非常好的方法是将共享代码放入SCM系统并将其包含在您想要的每个项目中。这样每个项目都可以共享代码,您可以在任何地方编辑它,只需检查更改当你感觉良好的时候进入源代码控制 - 然后所有其他项目都会从你的工作中受益。

与IMO的其他方式相比,这有很大的优势:

<强> VS。框架:将代码打包到框架中非常烦人,并且bundle-private框架需要花费不合理的长时间来加载 - 尤其是只需要将几个类添加到您的应用程序中。 Omni Group的Wil Shipley(当时)曾发现公司所有应用程序中包含的框架在每个应用程序的开始时间增加了几秒钟。在框架中打包私有类也可以鼓励更多的耦合,而不是严格必要的 - 只需要创建一个所有共享类所在的One True Framework真的很诱人,所以你开始假设这个代码将永远存在。它变得不可分割。基本上,框架是锤子,这个问题是一个棘手的问题。

<强> VS。仅包含文件:希望您无论如何都会将您的应用程序放入SCM中,并且只是简单地包含这些文件会产生问题,因为它们将从SCM中丢失。将文件复制到每个项目中会引入相反的问题 - 每个项目都将包含自己的文件版本,您必须手动传播任何有用的更改。

答案 2 :(得分:4)

最好的方法是创建一个包含共享类的独立框架。这可以编译一次并链接到两个应用程序项目中。

请参阅Apple's doc on what are Frameworks

答案 3 :(得分:2)

最快的解决方案是仅将.h和.m文件的引用添加到其中一个项目中。只需取消选中xcode中“添加现有文件”-dialog中的“复制” - 复选框即可。请记住,如果移动/共享项目,您可能还需要复制引用的文件。

答案 4 :(得分:2)

我遇到了类似的问题,上面接受的答案可能会导致新手出现问题。

如果两个项目通过某些协议进行通信,那就没关系,例如TCP / IP,或者如果他们不通信。但是,如果一个项目是一个捆绑包(例如一个插件),它需要访问与应用程序相同的类(同时在同一个进程中运行),则会遇到关于具有相同名称的类的链接或运行时警告/错误的问题。解决此问题的最简单方法是使用框架。使用框架,您可以设置它,以便所有三个目标都在同一个项目中,或者您甚至可以将框架包含在单独的项目中。

我有一个带有app和bundle插件的项目,这是我在Xcode 6中遵循的步骤:

  1. 创建一个框架,复制所有共享代码。
  2. 在框架的主标题中,包含所有共享代码的标题。
  3. 构建框架以测试它的构建(例如,选择框架的方案并单击播放)
  4. 转到Application和Plugin Bundle的Build Phases部分,并将新框架添加到'target dependencies'和'Link binary with libraries'
  5. 要在app和bundle中的代码中包含框架内容,只需使用主标题,然后使用&lt;&gt;而不是“&#34;例如,如果您的框架被称为Foo,请使用#import
  6. 当您运行主应用程序时,将自动编译对框架的更改,因此您实际上可以忽略它们是不同目标的事实。

答案 5 :(得分:1)

我在这里找到了一篇关于这个主题的好文章:http://www.clintharris.net/2009/iphone-app-shared-libraries/这回答了我的问题,这个问题是关于多个iPhone应用程序共享代码的。它没有提到框架(上图)所以我不能说他们的建议(xcode项目引用)是否与框架解决方案相比有利。