为iOS创建静态库是否值得?

时间:2012-09-07 14:13:26

标签: objective-c ios xcode static-libraries

我希望在大多数项目中都包含代码。像AFNetworking,CoreData和单元测试的类别等等。

将所有这些包含在静态库中似乎合乎逻辑,然后在每个项目中使用它。我注意到,许多第三方库(如AFNetworking及其前身ASIHTTP)都包含在项目中,方法是复制所有源文件,然后手动将必要的库链接到项目目标。

在我看来,这似乎是最简单的方法。花了相当多的时间来弄清楚如何将现有的静态库包含到项目中。即使我知道如何,对每个新项目来说,这仍然是一件痛苦的事情。此外,您指定的标头搜索路径是具有静态库文件的本地目录。将静态库的文件复制到项目中会不会更容易,有没有办法?这与直接包含类文件的想法相同,就像大多数库似乎已经完成的那样,但它会更有条理,因为所有内容都会被集中到一个库项目中,而不是在任何地方都有类文件,并且必须包含它们中的每一个。

静态库感觉它们应该是正确的方法。创建一个可以与包含每个项目所需的类的所有项目一起使用的库。说得通。我只是冲突,因为看起来正确的方法是将所有内容从“正式”库中删除,而只是复制所有类文件。

我想我只是在寻找经验丰富的开发人员认为最佳选择。

4 个答案:

答案 0 :(得分:7)

我是第一个承认在Xcode中引用静态库的过程并不完全直观的人。但是,毫无疑问,使用静态库是最佳选择。

主要原因是可维护性:当您将库的源代码复制到许多地方时,您必须记住在升级到库的下一个版本时将所有这些代码更新为最新代码。这可能是一个容易出错的过程,尤其是当底层库源发生重大变化时(例如添加新文件,重命名旧文件等)

答案 1 :(得分:3)

有一个中途解决方案 - 创建一个XCode项目,从源代码构建静态库,并将其放入一个共享存储库(即.. git子模块等),它包含在每个项目的主存储库中。

您的每个项目都包含此子模块和项目。然后他们每次拉动该子模块时都会获得最新的源代码。如果将其设置为构建依赖项,它将在您第一次构建时构建一个静态库,然后XCode足够智能,只需将每个后续构建包含在内,这样您就可以获得快速构建时间。

您还可以获得使用源代码进行步进/调试的优势。

如果它在一个单独的XCode项目中,并且新版本的库添加或删除了一个源文件,您只需要更改该共享项目 - 所有单个项目都不会发生变化。

答案 2 :(得分:1)

使用CocoaPods怎么样?这个工具以声明的方式完成你想要的工作:你有一个文件(Podfile),你声明你的依赖项,工具下载所有的依赖项,并构建一个静态库,添加到你的项目。

答案 3 :(得分:0)

我同意静态库感觉它们可能是出于多种原因的正确方法,但也会引入一些问题。

积极的方法是创建一种向项目添加库的简便方法。虽然不是非常直观,但是在执行几次之后将静态库添加到项目中是相当简单的。添加文件,添加搜索路径,完成。这在某些源控制情况下也很有用。此外,更新库可能更容易。

我认为这里的真正问题是开源社区。例如,通过将AFNetworking包括为静态库,您将失去对实现文件的所有访问权限。这是包含源而不是库的一个很好的功能。它允许您将代码更改为您认为合适的方式,并希望回馈。