ibtool 在编译和链接故事板阶段做什么以及链接的故事板的结果如何与可执行文件一起工作?

kaz*_*chi 5 xcode xcodebuild storyboard ios ibtool

我一直在研究 iOS 应用程序的构建过程。我创建了一个“单视图应用程序”项目并在 Xcode 8.2.1 中构建。当我查看构建报告时,我注意到 Xcode 使用 clang 编译和链接 .m 文件,然后使用 ibtool 编译和链接故事板文件。我想知道 ibtool 在编译和链接过程中实际做了什么。在执行以下编译命令后,会在/Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/Base.lproj/目录中创建 .storyboardc 文件,该文件将在稍后的“链接 Storyboards”阶段使用。.storyboardc文件是一组二进制文件,包括 Info.plist 文件。

 ObjCHelloWorld/Base.lproj/LaunchScreen.storyboard
cd /Users/Kazu/Dropbox/ObjCHelloWorld
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export XCODE_DEVELOPER_USR_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin/..
/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool --errors --warnings --notices --module ObjCHelloWorld --output-partial-info-plist /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/LaunchScreen-SBPartialInfo.plist --auto-activate-custom-fonts --target-device iphone --target-device ipad --minimum-deployment-target 10.2 --output-format human-readable-text --compilation-directory /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/Base.lproj /Users/Kazu/Dropbox/ObjCHelloWorld/ObjCHelloWorld/Base.lproj/LaunchScreen.storyboard
Run Code Online (Sandbox Code Playgroud)

在链接阶段,执行以下命令,我不知道 ibtool 在做什么。我所能告诉的是它使用storyboardc在编译阶段生成的文件。

LinkStoryboards
cd /Users/Kazu/Dropbox/ObjCHelloWorld
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export XCODE_DEVELOPER_USR_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin/..
/Applications/Xcode.app/Contents/Developer/usr/bin/ibtool --errors --warnings --notices --module ObjCHelloWorld --target-device iphone --target-device ipad --minimum-deployment-target 10.2 --output-format human-readable-text --link /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Products/Debug-iphonesimulator/ObjCHelloWorld.app /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/Base.lproj/LaunchScreen.storyboardc /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/Base.lproj/Main.storyboardc
Run Code Online (Sandbox Code Playgroud)

我的问题是,ibtool 在链接阶段做什么?是否有任何产品或其链接到由 clang 完成的先前链接阶段创建的可执行文件?

Edd*_*die 1

不确定您是否找到了答案,或者我的答案会回答您的问题,但无论如何我都会发布。

如果您在已编译的应用程序(IPA 文件)上达到峰值,您会看到常用XIB文件转换为NIB,并*.storyboard转换为*.storboardc(c 应该表示已编译)。然后,如果您使用文本编辑器打开 xib 或 Storyboard 文件,您应该会看到 xml 内容。

我相信当您使用 xcode 并查看 xib / Storyboard 文件时,ibtool 确实会生成用户界面的 xml 内容。然后,在构建时,它生成二进制文件(nib、storyboardc)。

链接阶段应该创建这些编译文件的路径并创建一个映射或类似的东西。当您调用打开这些文件时,应用程序将在地图中找到路径并在特定捆绑包(通常是主捆绑包,位于编译的应用程序文件夹的根目录中)中为您获取预期的 nib 文件。

PS:这可能就是为什么该方法是 call: initWithNibName,而不是initWithXibName