14

私は cocos2d フレームワークを使用して iOS ゲーム開発を行っています。Eclipse Java プログラマーがアプリケーションのデバッグ中にコードをホットスワップできることを非常にうらやましく思います (つまり、メソッド内の変数値を変更し、プログラムをライブ更新するかのように)。再コンパイルせずに REPL を持っていた)。

これは、私の開発環境が (明らかに) Xcode であり、プログラミングに使用している言語が Objective C である iOS 開発に関しては、非常に役立つもののように思えます。コミュニティに聞いてみようと思いました。

Objective Cでプログラミング中にXcodeでコードをホットスワップする方法があるかどうかは誰にもわかりませんか?

前もって感謝します

4

4 に答える 4

14

ライブで動作するアプリでコードを変更できる優れたプラグインがあります。これはInjectionPluginと呼ばれます。

FAQが言うように:

それはどのように機能しますか?Objective-C ランタイムを使用すると、アプリケーションに既に実装がリンクされている場合でも、バンドルを使用して新しいバージョンのクラスをアプリケーションにロードできます。スウィズリングは、バンドルがロードされて既存のクラスが新しい実装のメソッドを使用するように切り替えるときに使用されます。これは繰り返し行うことができ、OSX および iOS アプリケーションと iOS デバイスで機能します。

このプラグインをインストールして使用する方法を示す小さなビデオを作成しました http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

それが役に立てば幸い!

于 2013-05-09T13:57:33.510 に答える
11

現在のツールでは不可能です。

iOS アプリケーションは署名されていることに注意してください。1 バイトを変更すると、すべてを再署名する必要があります。メソッドを動的に追加および削除するためのランタイムのサポートを使用して機能させることを想像できます。しかし、それには、デバイス上でそれをサポートするためにいくつかの追加機能を追加する必要があり、それはマルウェアが簡単に利用できるものです. したがって、これはおそらくすぐに目にする機能ではないでしょう。

ちなみに、Xcode バージョン 1.x ~ 3.x には「修正して続行」機能がありました。デバッグ中に編集し、[修正して続行] コマンドを使用して、更新されたコードを実行し続けることができます。おそらくいくつかの組み合わせが原因で、ある時点で削除されたと思います。「ゼロリンク」を使用するようにプロジェクトを構成する必要があるなど。完全に信頼できるとは言えません。おそらくiOSをサポートしていません。llvm への切り替え。Xcode 4 のその他の変更点。いつか戻ってくるかもしれません。戻したい場合は、バグを報告してください。ただし、iOS でのサポートは難しいと思います。

于 2012-04-17T17:48:56.243 に答える
6

変数値の変更について話しているだけの場合は、lldb (または、おそらく) gdb を介して密かにそれを達成できます。あなたが持っていたと仮定します:

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

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

にブレークポイントを設定するとNSLog、その時点で lldb に localString の再割り当てを実行する手段として評価するように依頼できます。例えば

po localString = @"Hat"

その後、プログラムの実行を続行できるようにすると、再割り当てが停止していることがわかります。同様に、任意のメソッドを呼び出したり、他の種類の割り当てを実行したりできます。

これを Xcode 4.3.2 に対してテストしました。

于 2012-04-17T17:53:20.917 に答える
1

次の方法で、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
于 2016-09-27T04:51:33.087 に答える