2017-02-04 5 views
2

Я изучал процесс сборки приложения 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 Storiesboards». Файлы .storyboardc представляли собой набор двоичных файлов, включая файл Info.plist.Что делает ibtool при компиляции и связывании этапов раскадровки и как результат работы связанных раскадровки работает с исполняемым файлом?

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?

ответ

0

Не уверен, что вы нашли ответ или ответ на свой вопрос, но я все равно отправлю его.

Если взять пик на скомпилированном приложении (файлы АПИ), вы увидите ваши обычные XIB файлов преобразуются в NIB и *.storyboard преобразованы в *.storboardc (с должны означать компилируются). Затем, если вы открываете файлы xib или раскадровки с помощью текстового редактора, вы должны увидеть содержимое xml.

Я считаю, что ibtool создает содержимое xml для пользовательского интерфейса, когда вы используете xcode и просматриваете файлы xib/раскадровки. Затем при сборке он генерирует двоичные файлы (nib, storyboardc).

Фаза связывания должна создать путь к этим скомпилированным файлам и создать карту или что-то в этом роде. Когда вы совершаете вызов, чтобы открыть эти файлы, приложение найдет путь в карте и получит ожидаемый файл nib для вас в определенном пакете (обычно основной пакет, который находится в корне папки скомпилированных приложений).

PS: Это, вероятно, почему этот метод вызова: initWithNibName, не initWithXibName

Смежные вопросы