Xcodeの開発では、私はそれを保存するだけでファイルを再読み込みすることができます.


Xcodeを開発するとき、通常の手順はファイルを保存し、ビルドしてプログラムを実行することです.通常、プログラムを起動することはできません.しかし、“注入”と呼ばれるメカニズムを使用することができます.

1 .注入iiiを使用してください
氏はジョンHoldsworthは“InjectionIII”と呼ばれるアプリをリリースします.それは簡単に注射を行うことができます.
https://github.com/johnno1962/InjectionIII
それを使おうとしましょう.

1.1アプリケーションをインストールする
InjectionIIIアプリをインストールします.
https://apps.apple.com/jp/app/injectioniii/id1380446739?mt=12
インストール後、実行します.
プログレスIIIアプリケーションのアイコンがステータスメニューに表示されることを確認します
“ヘルプ/README”を選択し、次のページに接続されます.
https://github.com/johnno1962/InjectionIII

1.2 .サンプルをダウンロード
以下は注射IIIのホームページです.
http://johnholdsworth.com/injection.html
次のサンプルプログラムをダウンロードできます
http://johnholdsworth.com/GettingStarted.zip
これを解凍して"~/dev/gettingstart/"になります.

1.3 .Xcodeからサンプルを開く
24579142をダブルクリックして起動します.→ オープン.

1.4 .InjectionIIIアプリケーションからgettingstartを接続する
メニューの「IncectionIII」から「プロジェクトを開く」を選択します→ を選択します.→ プロジェクトディレクトリを選択

1.5 .ラン.
で実行する→ シミュレータに「マスター」を表示する→ を押して“+”と現在の時刻が表示されます.クリックして→現在の時刻と“changeme”が表示されます.
Xcodeへ戻る→CMD - 1→CMD - 1→「DetailleViewController」を選択します.スウィフト→変更“チェンジ”に“変更!”例えば→CMD - Sは、画面上の“changeme”を保存するには、すぐに変更されます.

2 .自分のプログラムから注射を試みる

2.1 .アプリの作成
まず、いくつかの簡単なアプリを開発する.テキストを表示するものです.
Xcodeを起動する→新しいXcodeプロジェクトを作成する→IOS→“シングルビューのアプリ”→次→製品名:“injectiontest”、ユーザーインターフェイス:ストーリーボード→次→を指定します→. クリエイト
ViewControllerで.swift , add show show ()は、viewdidload ()によって呼び出されます.
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        show()
    }
    func show() {
        let button = UIButton(frame: CGRect(x: 40, y: 100, width: 200, height: 100))
        button.backgroundColor = .cyan
        button.setTitle("Hello, world!", for: .normal)
        button.setTitleColor(.black, for: .normal)
        view.addSubview(button)
    }
}
このステージでそれを試してみましょう:CMD - R -:ビルドと実行し、シミュレータを起動し、“こんにちは、世界を!”
ViewControllerに戻ってください.スウィフトと変更“こんにちは、世界!”「こんにちは、日本へ!」とCMD - Sで保存しますが、変更は反映されません.
私は再びCMD - Rのアプリは、シミュレータが閉じて起動し、今回は“こんにちは、日本”に変更されます.通常、我々はアプリを終了し、この方法でそれを再読み込みします.ビルドが高速なので、このサイクルを約3秒で行うことができます.実際には、多くの苦情を持っていない可能性があります.

2.2 .リンカフラグを設定する
Xcodeに戻る→注射テストのプロジェクトを選択→プロジェクト:注入テスト→ビルド設定→リンク→他のリンカフラグ→カーソルを上に置くと左側に三角形が現れる→デバッグの右クリック→デバッグ→任意のアーキテクチャのいずれかのSDK :"- xlinker -インタポーザブル"→確認を返します.

2.3 .束を加える
AppDirecateにバンドルを追加します.スウィフト.
        #if DEBUG
        Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
        #endif
参照のために、これはAppDirectoryの適用可能なメソッドの全体です.スウィフト.
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        #if DEBUG
        Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
        #endif
        return true
    }

2.4 .を追加します.
注入した方法をGettingStarted.xcodeprojに加える.
    @objc func injected() {
        show()
    }
参考のために、これはViewControllerクラスの全体です.
class ViewController: UIViewController {
    @objc func injected() {
        show()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        show()
    }
    func show() {
        let button = UIButton(frame: CGRect(x: 40, y: 100, width: 200, height: 100))
        button.backgroundColor = .cyan
        button.setTitle("Hello, world!", for: .normal)
        button.setTitleColor(.black, for: .normal)
        view.addSubview(button)
    }
}

2.5 .プロジェクトの指定
メニューの「IncectionIII」から「プロジェクトを開く」を選択します→ を選択します→ プロジェクトディレクトリを選択

2.6実行
三菱電機→シミュレータを起動し、“こんにちは、世界!”が表示されます.出力は次の通りです.
💉 Injection connected 👍
💉 Watching /Users/eto/dev/InjectionTest/**

2.7 .編集.
ViewControllerで.Swiftは、次のように対応する行を編集してみましょう.「世界」を「日本」に変える.
        button.setTitle("Hello, Japan!", for: .normal)
ファイルを保存します.では、「こんにちは、世界!」シミュレータの変更についてすぐに(約1秒).出力は以下のようになります.
💉 *** Compiling /Users/eto/dev/InjectionTest/InjectionTest/ViewController.swift ***
💉 Loading .dylib ...
objc[31231]: Class _TtC13InjectionTest14ViewController is implemented in both /Users/eto/Library/Developer/CoreSimulator/Devices/97670822-70F9-46B8-87F7-5545DF54E516/data/Containers/Bundle/Application/82DDD3CB-9924-4E5C-BCCC-1AE2A8A9E3AD/InjectionTest.app/InjectionTest (0x107b53b40) and /var/folders/94/shwk5bk14l5fx43cggr_n04m0000gn/T/com.johnholdsworth.InjectionIII/eval106.dylib (0x110d9c280). One of the two will be used. Which one is undefined.
💉 Loaded .dylib - Ignore any duplicate class warning ^
💉 Injected 'ViewController'
💉 Replacing InjectionTest.ViewController.__allocating_init(coder: __C.NSCoder) -> Swift.Optional<InjectionTest.ViewController>
💉 Replacing InjectionTest.ViewController.__allocating_init(nibName: Swift.Optional<Swift.String>, bundle: Swift.Optional<__C.NSBundle>) -> InjectionTest.ViewController
💉 Replacing InjectionTest.ViewController.viewDidLoad() -> ()
💉 Replacing InjectionTest.ViewController.show() -> ()
💉 Replacing InjectionTest.ViewController.injected() -> ()
💉 Class ViewController has an @objc injected() method. Injection will attempt a "sweep" of all live instances to determine which objects to message. If this crashes, subscribe to the global notification "INJECTION_BUNDLE_NOTIFICATION" to detect injections instead.
内部で起こっていることを説明するには、InjectionIIIアプリは常にViewControllerを見ている.迅速かつそれが編集を検出すると、アプリケーションがすぐにコンパイル、動的にロードし、メソッドを置き換えます.その後、injected()が呼び出され、表示が交互に行われます.このように、プログラムの実行中に動的にメソッドを書き換えることができ、プログラム開発の効率を高めると考えられる.
これまでのファイルを以下に示します.
そのプログラムはそのまま実行できるはずだ.
https://github.com/eto/InjectionTest
完了!