Вопрос по xcode, objective-c – Горячая замена кода в Xcode?

14

Я занимаюсь разработкой игр для iOS с использованием каркаса cocos2d и очень завидую возможности программистов Eclipse Java оперативно менять свой код во время отладки своего приложения (т. Е. Изменять значения переменных внутри метода и обновлять программу в режиме реального времени, как будто вы был REPL без перекомпиляции).

Это кажется чем-то очень полезным, когда дело доходит до разработки под iOS, где моя среда разработки (очевидно) - Xcode, а язык, на котором я программирую, - это Цель C. Я гуглил, но не смог ничего найти - так Я думал, что спрошу сообщество.

Кто-нибудь знает, есть ли способ горячей замены кода в XCode при программировании в Objective C?

заранее спасибо

Раньше у Xcode это было, но IIRC было медленным и ненадежным, и люди просто не использовали его, поэтому Apple убила эту функцию, чтобы сосредоточиться только на улучшении отладчика. Chuck
Если он находится в переменной, вы можете просто отредактировать его значение в отладчике. Steven Fisher
Это позор, знаете ли вы какие-либо функции отладки, которые предоставляют аналогичные / эквивалентные функции? Я пытаюсь уменьшить количество раз, когда я изменяю переменную, перестраиваю и запускаю, чтобы посмотреть, верное ли это число (игровой разработчик - это много проб и ошибок) Salman

Ваш Ответ

4   ответа
13

который позволяет менять код в живом, работающем приложении. Это называетсяInjectionPlugin.

Как часто задаваемые вопросы говорит:

How does it work? The Objective-C runtime allows you to load a new version of a class into an application using a bundle even if there is already an implementation linked into the application. Swizzling is used as the bundle is loaded to switch the existing class to use the methods of the new implementation. This can be done repeatedly and works for OSX and iOS applications and on iOS devices.

Я сделал небольшое видео, которое показывает, как установить и использовать этот плагин http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

Надеюсь, поможет!

Error: User Rate Limit Exceeded
11

Имейте в виду, что приложения для iOS подписаны - если вы измените один байт, вы все равно подали бы в отставку. Можно представить, как это работает, используя динамическую поддержку для добавления и удаления методов во время выполнения. Но это, безусловно, потребует добавления дополнительных устройств для поддержки его на устройстве, и это то, что вредоносное ПО может легко использовать в своих интересах. Так что это, вероятно, не та функция, которую вы, скорее всего, увидите в ближайшее время.

Между прочим, версии Xcode 1.x-3.x имели «Исправить и продолжить». особенность. Вы можете редактировать во время отладки, использовать команду «Исправить и продолжить» и продолжить запуск обновленного кода. Я полагаю, что он был удален в какой-то момент, возможно, из-за некоторой комбинации: требования, чтобы ваш проект был настроен на использование «нулевой ссылки»; и, возможно, некоторые другие вещи; быть менее чем полностью надежным; вероятно, не поддерживает iOS; переключатель на llvm; другие изменения в Xcode 4. Может быть, он когда-нибудь вернется - если вы хотите вернуть его, сообщите об ошибке - но, опять же, я думаю, что поддержка его на iOS будет проблемой.

Error: User Rate Limit ExceededanswerError: User Rate Limit ExceededInjectionPlugin.
6

то можете достичь этого тайно через lldb (или, предположительно), gdb. Предположим, у вас было:

- (void)uselessMethod
{
    NSString *localString = @"I'm some local text";

    NSLog(@"%@", localString);
}

И поставить точку останова наNSLog, в этот момент вы можете попросить lldb оценить переназначение localString как средства его выполнения. Например.

po localString = @"Hat"

Если вы затем продолжите выполнение программы, вы обнаружите, что переназначение застряло. Точно так же вы можете вызвать любой метод или выполнить любое другое назначение.

Я только что проверил это на Xcode 4.3.2.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Salman
1

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

Похожие вопросы