Горячая замена кода в 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