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

时间:2017-02-04 17:01:42

标签: ios xcode storyboard xcodebuild ibtool

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

在链接阶段,执行以下命令,我不知道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

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

1 个答案:

答案 0 :(得分:0)

不确定您是否已找到答案,否则我会回复您的答案,但无论如何我都会发布。

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

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

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

PS:这可能是调用此方法的原因:initWithNibName,而不是initWithXibName