Горячая замена кода в Xcode?
Я занимаюсь разработкой игр iOS с использованием инфраструктуры cocos2d, и я чрезвычайно завидую способности программистов Eclipse Java к горячей замене своего кода, когда они отлаживают свое приложение (т.е. изменяют значения переменных внутри метода и имеют текущее обновление программы как если бы у вас был REPL без перекомпиляции).
Это похоже на что-то, что было бы чрезвычайно полезно, когда дело доходило до разработки iOS, где моя среда разработки (очевидно) Xcode и язык, на котором я программирую, - это Objective C. Я искал googled, но havent смог найти ничего - поэтому я думал, что попрошу сообщество.
Кто-нибудь знает, есть ли способ для кода Hot Swap в Xcode при программировании в Objective C?
Заранее спасибо
Ответы
Ответ 1
Невозможно использовать текущие инструменты.
Имейте в виду, что приложения iOS подписываются - если вы меняете один байт, вы должны отказаться от всего этого. Можно было подумать, что он работает, используя поддержку времени выполнения для динамического добавления и удаления методов. Но для этого наверняка потребуется добавить некоторые дополнительные материалы, чтобы поддерживать его на устройстве, и что то, что вредоносное ПО может легко использовать. Таким образом, это, вероятно, не функция, которую вы, вероятно, увидите в ближайшее время.
Кстати, версии Xcode 1.x-3.x имели функцию "Исправить и продолжить". Вы можете отредактировать по мере отладки, использовать команду "Исправить и продолжить" и продолжить выполнение обновленного кода. Я считаю, что он был удален в какой-то момент, возможно, из-за некоторой комбинации: требуя, чтобы ваш проект был настроен на использование "нулевой ссылки" и, возможно, некоторых других вещей; менее надежны; вероятно, не поддерживает iOS; переключатель в llvm; другие изменения в Xcode 4. Возможно, он вернется когда-нибудь - если вы хотите его вернуть, напишите ошибку - но опять же, я думаю, что поддержка его на iOS была бы проблемой.
Ответ 2
Существует большой плагин, который позволяет изменять код в реальном времени, работая APP. Он называется InjectionPlugin.
Как часто задаваемые вопросы:
Как это работает? Среда выполнения Objective-C позволяет загружать новую версию класса в приложение с помощью пакета, даже если уже есть реализация, связанная с приложением. Swizzling используется для загрузки пакета для переключения существующего класса на использование методов новой реализации. Это можно сделать многократно и работает для приложений OSX и iOS и на устройствах iOS.
Я сделал небольшое видео, которое показывает, как установить и использовать этот плагин
http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/
Надеюсь, что это поможет!
Ответ 3
Если вы просто говорите об изменении значений переменных, вы можете сделать это незаметно через lldb (или, предположительно) gdb. Предположим, что у вас было:
- (void)uselessMethod
{
NSString *localString = @"I'm some local text";
NSLog(@"%@", localString);
}
И поставьте точку останова на NSLog
, в этот момент вы можете попросить lldb оценить переназначение localString как средство ее выполнения. Например.
po localString = @"Hat"
Если вы затем продолжите выполнение программы, вы должны обнаружить, что переназначение застряло. Аналогичным образом вы можете вызвать любой метод или выполнить любое другое назначение.
Я только что протестировал это против Xcode 4.3.2.
Ответ 4
Вы можете "горячую" замену значения переменной в Xcode на:
expression <variable> = <value>;
.
Имея точку разрыва в том месте, где вы хотите изменить значение и выполнить команду в консоли Xcode.
Пример:
// Messages From Console
(lldb) expression graphFlag = @"X"; // Update variable value
(__NSCFConstantString *) $0 = 0x36f95718 @"X" // Xcode prints the updated value
(lldb) expression graphFlag; // Printing value through expression command
(__NSCFConstantString *) $1 = 0x36f95718 @"X" // Hot Swapped variable value