32

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

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

还有其他信息吗?

谢谢。

4

6 回答 6

14

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

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

我真的很喜欢让每个相关产品都生活在一个单一的 xcode 项目“屋顶”下,因为您不必在 xcode 项目中跳来跳去,而且它确实简化了共享文件的 SCM 管理。

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

更新:在 xcode 中配置特定于目标的头文件时会涉及一些额外的麻烦(它总是......对吗?!);例如,对此目标使用“myHeaderA.h”,对该目标使用“myHeaderB.h”。这是一篇很棒的帖子,分享了如何做到这一点:控制 Xcode 将包含哪个项目头文件。注意:以这种方式设置后,xcode 不再知道搜索任何目标头文件的路径,因此您必须手动设置它们。为此,请右键单击目标上的获取信息,选择构建类别,然后通过“标题搜索路径”设置添加路径。路径将按照您输入的顺序进行搜索。

于 2010-07-18T23:24:42.097 回答
13

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

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

与框架相比:将代码打包到框架中非常烦人,并且捆绑私有框架需要花费不合理的时间来加载——尤其是仅仅为了将一些类添加到您的应用程序中。Omni Group 的 Wil Shipley(当时)曾经发现,该公司在其所有应用程序中包含的框架使每个应用程序的启动时间增加了几秒钟。在框架中打包私有类也可以鼓励更多的耦合,而不是严格必要的——将一个真正的框架放在所有共享类所在的地方真的很诱人,所以你开始假设这段代码将永远在一起。它变得密不可分。基本上,框架是一把锤子,这个问题是一个螺丝钉。

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

于 2010-05-17T17:02:21.440 回答
4

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

请参阅Apple 关于什么是 Frameworks 的文档

于 2010-01-24T12:33:44.850 回答
2

I had a similar issue, and the accepted answer above may cause issues for a newbie.

It will be fine the if the two projects communicate by some protocol e.g. TCP/IP, or if they don't communicate. If however one project is a bundle (e.g. a plugin) which needs to access the same classes as an application (whilst being run in the same process) you will get issues with linking or runtime warnings/errors about having classes with the same name. The simplest way to solve this problem is to use a framework. With a framework you can set it up so all three targets are in the same project, or you can even include the framework in separate projects.

I had a project with an app and a bundle plugin, here are the steps I followed in Xcode 6:

  1. Create a framework, copy all the shared code over.
  2. In the main header of the framework, include the headers of all the shared code.
  3. Build the framework to test it builds (e.g. select the scheme of the framework and click play)
  4. Go to the Build Phases section of both the Application and the Plugin Bundle and add the new framework to ‘target dependencies’ and ‘Link binary with libraries’</li>
  5. To include the frameworks stuff in code in the app and bundle, just use the main header, and use <> rather than “" e.g if your framework was called Foo use #import

Changes to the framework will be compiled automatically when you run the main app, so you can in effect ignore the fact they are different targets.

于 2014-08-01T12:16:09.163 回答
2

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

于 2010-01-24T15:33:28.233 回答
1

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

于 2010-05-17T16:46:46.450 回答