在iOS世界中,每个源文件都转换为目标文件-ABI About(https://stackoverflow.com/a/59271017/4770877) Mach-O文件About(https://stackoverflow.com/a/59214522/4770877),将打包为最终可执行文件包(应用程序、框架)、文件(库),其行为由Mach-O typeAbout(https://stackoverflow.com/a/61035316/4770877)确定 Package是一个目录,其行为类似于文件-opaque file。创建该目录的目的是用户体验,以使对内部结构进行某些更改变得复杂,从而导致不可预测的程序行为。Package用于Document Package或Bundle。您可以在Finder中使用Show Package Contents Bundle是一个具有特定结构的目录,用于组织二进制文件(可执行代码)和该代码的资源(例如图像、nibs ... www.example.com文件About(https://stackoverflow.com/a/61040332/4770877))。包包含Info.plistAbout(https://stackoverflow.com/a/61118898/4770877)文件。包是为开发人员体验创建的。它也可以打包。包有几种类型:Assets.car file About(https://stackoverflow.com/a/61040332/4770877) ). Bundle contains Info.plistAbout(https://stackoverflow.com/a/61118898/4770877) file. Bundle was created fordeveloper experience. Also it can be packaged. There are several types of bundle:
Library vs Framework(https://stackoverflow.com/a/66808163/4770877) Martin Fowler on InversionOfControl 库本质上是一组你可以调用的函数,现在通常被组织成类。每个调用做一些工作并将控制权返回给客户端。 一个框架包含了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或者插入你自己的类来将你的行为插入到框架的不同地方。然后框架的代码在这些地方调用你的代码。程序的主控制被反转,从你身上转移到框架上。这种现象就是控制反转(也称为好莱坞原则-"不要打电话给我们,我们会打电话给你")
3条答案
按热度按时间hc2pp10m1#
首先是一些通用定义(特定于iOS):
然而,iOS静态库不允许包含图像/资产(仅代码)。不过,您可以通过使用媒体包来绕过这个挑战。
一个更好、更正式的定义可以在Wikipedia here上找到。
建议使用动态共享库,因为它有很多优点。但是,早期版本的Mach-O启动应用的速度比使用静态库的应用稍慢。最新版本的Mach-O启动应用的速度比使用静态库的应用快得多。
Apple不建议使用Standalone动态共享库-这种动态共享库仅适用于macOS平台(库存储在/use/lib,只有Apple可以正式这样做),但非独立动态共享库是当今任何框架的一部分(. framework bundle)。
因此,实际上可以有一个静态框架或一个动态框架,它们只是带有静态共享库或动态共享库的容器。
更多详情请参见Wiki on Software Framework。
因此,在iOS上,您唯一的选择基本上是使用静态共享库(
.a
文件)或框架(内部包含静态或动态共享库)。关于项目中的 * subproject *,据我所知,要使其正确工作/编译,您必须建立一个编译链,首先编译子项目,这将创建一个静态框架
.a
文件,该文件被项目用作依赖项。这里有另一个有用的教程,其中谈到这一点:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
jum4pzuy2#
.o
)**在iOS世界中,每个源文件都转换为目标文件-ABI About(https://stackoverflow.com/a/59271017/4770877) Mach-O文件About(https://stackoverflow.com/a/59214522/4770877),将打包为最终可执行文件包(应用程序、框架)、文件(库),其行为由
Mach-O type
About(https://stackoverflow.com/a/61035316/4770877)确定Package
是一个目录,其行为类似于文件-opaque file
。创建该目录的目的是用户体验,以使对内部结构进行某些更改变得复杂,从而导致不可预测的程序行为。Package用于Document Package
或Bundle
。您可以在Finder中使用Show Package Contents
Bundle
是一个具有特定结构的目录,用于组织二进制文件(可执行代码)和该代码的资源(例如图像、nibs ... www.example.com文件About(https://stackoverflow.com/a/61040332/4770877))。包包含Info.plist
About(https://stackoverflow.com/a/61118898/4770877)文件。包是为开发人员体验创建的。它也可以打包。包有几种类型:Assets.car file About(https://stackoverflow.com/a/61040332/4770877) ). Bundle containsInfo.plist
About(https://stackoverflow.com/a/61118898/4770877) file. Bundle was created fordeveloper experience. Also it can be packaged. There are several types of bundle:Application target
framework bundle
和versioned bundle
-Framework Target
loadable bundle
(又名plug-in bundle
)-"...捆绑包"(UI测试捆绑包、单元测试捆绑包)-可在运行时加载。适用于Mac OS的.bundle
扩展XPC Service
-跨进程通信是一种进程间通信(IPC)。它可用作不同进程(由launchd
根进程管理)About(https://stackoverflow.com/a/66371178/4770877)上的模块dSYM
About(https://stackoverflow.com/a/62219237/4770877)捆绑包)Application
-.ipa
、.app
About(https://stackoverflow.com/a/61027062/4770877)-packaged
application bundle
-可启动的程序。Application extension
About(https://stackoverflow.com/a/66520509/4770877)-来自iOS v8-扩展了用户与其他应用程序交互时可用的应用程序功能。App extension
作为捆绑包是Containing app
的一部分,但它在自己的沙箱(处理器、内存...)上运行,尝试使用app extension
的应用程序称为Host App
。扩展应用程序的类型:共享公共代码和资源。当部署目标为iOS 8+时可用。
Tests
-packaged
loadable bundle
,用于测试二进制文件。插件架构允许我们将新功能(测试用例)作为单独模块添加到现有二进制文件中Library vs Framework(https://stackoverflow.com/a/66808163/4770877)
Martin Fowler on InversionOfControl
库本质上是一组你可以调用的函数,现在通常被组织成类。每个调用做一些工作并将控制权返回给客户端。
一个框架包含了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或者插入你自己的类来将你的行为插入到框架的不同地方。然后框架的代码在这些地方调用你的代码。程序的主控制被反转,从你身上转移到框架上。这种现象就是控制反转(也称为好莱坞原则-"不要打电话给我们,我们会打电话给你")
他们可以帮助您解决:模块化、重用、封装、缩短构建时间
Library
是为一个或多个体系结构编译的Mach-O对象文件check static or dynamic(https://stackoverflow.com/a/61027434/4770877)的集合。Static library
-.a
(aka static archive library,static linked shared library [doc])--当您将其添加到应用程序中时,static linker在编译时将合并库中的目标文件,并将它们与应用程序目标文件打包成一个可执行文件。缺点是输出文件较大从Xcode 9.0开始,支持Swift静态库。
x1米36英寸1x-x1米37英寸1x(又称动态共享库、共享对象、动态链接库[doc])在加载或运行时与应用的可执行文件动态链接,但不会复制到其中。在练习中,应用程序的软件包将包含带有
.dylib
文件的Frameworks文件夹。所有iOS和macOSsystem库都是dynamic
。缺点是启动时间很慢,因为所有动态库都需要复制和链接。iOS static vs dynamic library(https://stackoverflow.com/a/73857639/4770877)
Static vs dynamic linking(https://stackoverflow.com/a/61140381/4770877)
Text-based stub library
-.tbd
About(https://stackoverflow.com/a/55560213/4770877),它是dynamic library
的文本存根,位于目标设备上。因此,您不应将动态库打包到您的捆绑包中。它具有大小效应。Framework
又名binary framework
-.framework
是一个not packaged framework bundle
(允许开发人员轻松查看头文件和资源),它包含一个编译的static or dynamic
库、头文件和资源。Static framework
包含与其资源打包在一起的static library
。Dynamic framework
又名Embedded framework
-来自iOS v8-包含dynamic library
和资源。除此之外,动态框架可以在单个捆绑包(versioned bundle
)中包含同一动态库的不同版本。此外,Embedded framework
还用于App Extension
Static vs dynamic framework(https://stackoverflow.com/a/57741985/4770877)
Umbrella framework
Aggregate target(https://stackoverflow.com/a/59215042/4770877)是一个包含其他框架的框架。它在iOS上不受官方支持,这就是为什么不建议开发者创建它们[官方文档]。实际上它是一组子框架(或嵌套框架)。当您创建具有依赖项的框架时,消费者(例如应用程序)负责将此依赖项与您的框架一起添加到项目中。作为开发人员,很自然地,我们会设法把这种责任从消费者身上转移到你身上。因此,您认为Umbrella framework
是救星,但通常它会导致管理版本以及创建和支持它的复杂性方面的严重问题。Fake Framework
-是static library
下的特定操作的结果,用于创建一个带有.framework
扩展的捆绑包,该捆绑包将表现为dynamic framework
。当Xcode没有框架模板而不支持创建框架时使用了此技术。fake framework的实现之一。随着Xcode 6,苹果增加了iOS框架支持。Modular Framework
About(https://stackoverflow.com/a/59213694/4770877)-@import
它是一个包含.modulemap
文件的框架。模块可以包含子模块。主要优点是使用Modular Framework
可以节省构建时间。Universal Library or Framework
(aka Fat)lipo(https://stackoverflow.com/a/59215277/4770877) Aggregate target(https://stackoverflow.com/a/59215042/4770877)包含多个架构。例如,您的发布版本应该支持一些拱,您可以通过Build Active Architecture Only
ONLY_ACTIVE_ARCH(https://stackoverflow.com/a/59215429/4770877)进行调整XCFramework
About(https://stackoverflow.com/a/67181295/4770877)由Xcode 11引入,它是一个包含多种架构(arm、x86_64 ...)和平台(iOS、MacOS ...)的bundle
,应该取代Universal Framework
Dependency
About(https://stackoverflow.com/a/59215808/4770877)您可以使用第三方代码作为目标的一部分,它允许您重用来自许多源的代码,如另一个项目、同一工作区中的项目、另一个目标、库、框架等。Xcode Build System(https://stackoverflow.com/a/59216120/4770877)
Xcode components(https://stackoverflow.com/a/59215808/4770877)
Dynamic linker(https://stackoverflow.com/a/59216681/4770877)
qvk1mo1f3#
您还可以为CocoaPods(www.example.com)创建.podspec文件http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo,并像使用任何其他pod一样使用它,唯一的区别是它是您的私有pod,对外部世界不可见(我不确定如果您的pod创建CoreData模型会发生什么,但据我所知,情况并非如此)。