Что делает ibtool на этапе компиляции и компоновки раскадровок и как результаты связанных раскадровок работают с исполняемым файлом?
Я исследовал процесс сборки приложения для iOS. Я создал проект "Single view application" и встроил в Xcode 8.2.1. Просматривая отчет о сборке, я заметил, что Xcode компилирует и связывает файлы.m с помощью clang, а затем компилирует и связывает файлы раскадровки с помощью ibtool. Мне интересно, что на самом деле делает ibtool в процессе компиляции и компоновки. После следующей команды компиляции файлы.storyboardc создаются в /Users/Kazu/Library/Developer/Xcode/DerivedData/ObjCHelloWorld-guewhpmwckompbfvsbhizkifcadg/Build/Intermediates/ObjCHelloWorld.build/Debug-iphonesimulator/ObjCHelloWorld.build/Base.lproj/
каталог, который будет использоваться позже в фазе "Link 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
На этапе компоновки выполняется следующая команда, и я понятия не имею, что делает 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 ответ
Не уверен, что вы нашли ответ или мой ответит ваш, но я все равно опубликую его.
Если вы возьмете пик в скомпилированном приложении (файлы IPA), вы увидите свой обычный XIB
файлы преобразованы в NIB
, а также *.storyboard
конвертировано в *.storboardc
(c должен означать скомпилированный). Затем, если вы откроете файлы XIB или раскадровки в текстовом редакторе, вы должны увидеть содержимое XML.
Я считаю, что ibtool генерирует XML-содержимое для пользовательского интерфейса, когда вы используете xcode и просматриваете файлы xib / storyboard. Затем при сборке генерирует двоичные файлы (nib, storyboardc).
Фаза связывания должна создать путь к этим скомпилированным файлам и создать карту или что-то в этом роде. Когда вы делаете вызов, чтобы открыть эти файлы, приложение находит путь на карте и получает ожидаемый для вас файл пера в определенном пакете (обычно это основной пакет, который находится в корне папки скомпилированного приложения).
PS: Вероятно, поэтому метод называется: initWithNibName
не initWithXibName