問題タブ [swizzling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - システム内のクラスのインスタンスを Objective-C のサブクラスに置き換えるにはどうすればよいですか?
特定の機能を追加するために、システム クラス (具体的には UINavigationBar) をサブクラス化しました。UINavigationBar の代わりとして、私はこれをどこでも使用しています。ただし、システム フレームワークで使用される一部の UINavigationBars をカスタム サブクラスに置き換えて、同じ動作を提供したいと考えています。具体的には、UITabBarController の more ビュー コントローラーの UINavigationBar を自分のクラスのインスタンスにしたいと考えています。
これは無理だろうと思ったので、UINavigationBar にカテゴリを作成してみました。これはシステム内のあらゆる場所に伝播します。ただし、私のカテゴリでは、カスタムの初期化と破棄 (NSNotificationCenter の通知の購読と購読解除) を行う必要があります。カテゴリの init/dealloc メソッドを上書きすると、元のメソッド (UINavigationBar によって実装されている) を呼び出すことができなくなり、非常に危険/致命的/おそらくあまり機能しない可能性があります。
考えられる解決策の 1 つはメソッドのスウィズリングですが、その使用方法はよくわかりませんし、明らかに非常に複雑になる可能性があります。
私の問題を解決する何かを実装する方法 (またはメソッド スウィズリングを使用する方法のカスタム コード) を詳しく説明できる人がいれば、非常に感謝しています。
objective-c - メモリ アドレスによるメソッドの置換
メソッドをメモリアドレスでスウィズルする方法があるかどうか疑問に思っていました。例: メソッド 0xFFFFFF へのポインタがあります。アプリケーションにメソッドがあります。ポインターを my メソッドに置き換えたい。Objective-C でこのポインタを置き換える方法はありますか。ありがとう。
swizzling - メソッドSwizzleCrash:ベトナム語キーボードの障害とクラッシュ
編集:他の人がバグを見つけるのを助けるために、質問の前に「MethodSwizzleCrash」を付けました。
シミュレーターまたはiOS4以降を実行しているデバイスのベトナム語キーボードで押されたキーごとに、次のメッセージがコンソールに出力され、最初のレスポンダーに文字が送信されません。
サーバーまたはクライアントコードにこれらの文字列またはサブ文字列のインスタンスはありません。これはAPIから来ています。
iOS 4を実行しているシミュレーターとデバイスは、2回目のキーを押すと常にクラッシュします。iOS5ではクラッシュは発生しません。コールスタックの最上位のエラーは次のようになります。
呼び出しスタックは次のようになります。
このキーボードは、メインビューが読み込まれる前のセキュリティ画面や、すべての入力処理メソッドがデリゲートにコメントアウトされているなど、アプリケーション全体のさまざまな場所で試しました。失敗は一貫しています。デリゲートメソッドが実装されていて、textField:shouldChangeCharactersInRange:replacementString:をステップ実行すると、受け取った文字列は有効です。
すべてがこれがAppleの問題であることを示しているようですが、私はこの問題に関する他の報告をオンラインで見つけていません。私の腸はそれが私のコードの何かだと言っています。誰かがヒントを貸すことができますか?
c++ - C++ を使用して OpenGL の頂点配列にシェーダーを適用しようとすると問題が発生する
4 つの次元頂点 (X、Y、A、B) を 6 つの個別の 2D プロット (XxY、XxA、XxB、YxA、...) として描画したい
私の頂点は次のように定義されています。
2D プロットの最初の (X,Y) をうまく描画できます:
他の 2D プロット (XxA、AxB など...) を描画するために、描画する次元に応じて頂点の X、Y、Z、W 次元を入れ替えるシェーダーを使用することにしました。
プログラムへのシェーダーのロード、コンパイル、追加、およびプログラムのリンクに成功しました。
シェーダー プログラムができたので、頂点配列の描画方法に影響を与えるようなプログラムの使用方法が明確ではありません。次のことを試しましたが、シェーダーがない場合とまったく同じように描画されるため、効果がないようです。
私が見逃している、または正しく理解していない基本的なものはありますか?
編集 2 : クリスチャンの提案に従って、シェーダー コードを更新しました。また、シェードがエラーなしで読み込まれることも確認しましたが、glUseProgram を呼び出した後に OpenGl エラーをチェックすると、エラーが発生しOpenGL Error: invalid operation
ます。
編集 3 : 動作した最終的なシェーダーは次のとおりです。
ios - IOSでの低レベルTCPメソッドのスウィズリング
IOSアプリケーションとの間のすべてのTCPトラフィックに関する情報を取得する方法を見つけようとしています。アプリケーションは非常にシンプルで、単一のUIWebViewオブジェクトで構成されています。
NSURLRequestでスウィズリングを使用しようとしましたが、うまくいきませんでした。私のバージョンのrequestWithURL:は、NSURLRequestを手動で呼び出すと呼び出されますが、UIWebViewのページに移動すると呼び出されないようです。裏で別のオブジェクトを使用していると思います。
そこで、CFSocket関数にフックしようと考えましたが、それらはクラスの一部ではないため、どのようにスウィズルするか(または可能かどうか)わかりません。
IOSのC関数、またはTCP(またはHTTP)トラフィックにアクセスするためにスウィズルしようとする他のAPIにフックする方法はありますか?
また、メインの.htmlページのほとんどで機能するNSURLCacheを使用してみましたが、多くの人が.csファイルを見つけており、他の人はキャッシュを通過していないようです。
ありがとう!
iphone - Iphone: リフレクションを使用して関数を置き換える
私は書き直したい小さな関数を持っているので、その関数はすべてのクラスで有効です。現時点では、すべて同じように機能する同じ関数が 10 個ありますが、すべての関数は別のクラス用です。私は反射でそれをしなければならないことを知っていますが、それを行う方法がよくわかりません。私はすでにこのリンクを読んでいます: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
私が話している機能は次のとおりです。
MissionSectionList と DamageAccountList は、どちらも 2 つの異なるクラスの NSMutableArray です。クラスが NSMutableArray で構成されているかどうかを確認することはできますか? はいの場合は .... modelObject.MyMutableArray を呼び出す必要がありますか?
objective-c - -[CALayer drawInContext:]は何かをしますか?
ドキュメントによると、 デフォルトの実装は何もしません。
しかし...drawRectメソッドから例外をスローすると、次のコールスタックが表示されます
理解できるように、これは-[CALayer drawInContext:]呼び出しデリゲートメソッドのデフォルトの実装を意味します。それが正しいか?私はスウィズリングテクニックを知っているので、Objective-Cで何もわかりません...
iphone - [UIView (MyOwnCategory) drawRect:] は 3.1.3 で呼び出されませんか?
私は独自の drawRect メソッドを定義し、4.2.1 (iOS) 5.0 (iOS) および 4.3.2 (シミュレーター) で正常に呼び出されます。しかし、3.1.3 (iPhone 2g) では呼び出されませんでした。
これにはどのような理由が考えられますか?
PS 質問を書き始めてから、3.1.3 デバイスがジェイルブレイクされていると思います。たぶん、それがこの奇妙な動作の根本的な原因です。
Upd:問題を再現するには、次のコードを使用します:
[super drawRect: rect]
明示的に呼び出しても3.1.3で例外は発生しませんでした
objective-c - App Store - メソッド スウィズリングの合法性
メソッドの入れ替えが App Store で合法/違法かどうかに関する現在の情報はありますか?
私が見つけることができる唯一のデータ ポイントは、この通知から始まった、しばらく前のThree20 フレームワークのシェイクアップです。
現在 App Store に投稿されているアプリケーション xxx は、method_exchangeImplementations を使用して、Apple 提供の API の実装を独自の実装と交換しています。今後の変更により、iPhone OS 4.0 でアプリケーションのこの動作が原因でクラッシュしたり、ユーザー データが失われたりする可能性があります。
xxx は method_exchangeImplementations を使用して、dealloc の実装をメソッド ttdealloc と交換します。また、メソッド popViewControllerAnimated: の実装をメソッド popViewControllerAnimated2: と交換します。
この問題をすぐに解決して、新しいバイナリを iTunes Connect にアップロードしてください。削除することが賢明である、または必要であると判断した場合は、アプリケーションを削除することがあります。
調べてみると、スウィズリングに関する最近の会話はすべて、同じ Three20 事件を参照しているようです。通知はかなり具体的であるように思われます.Three20が行った変更に伴う特定の変更の問題なのか、それともmethod_exchangeImplementationsが普遍的に禁止されているのか疑問に思っています.
慣行が許可されているかどうかについて、他にデータポイントはありますか? スウィズリングを使用しているストア内のアプリの開発者はいますか?
ありがとう!
objective-c - 複数のメソッドスウィズルのメソッドIMPをコピーする
理想的には、渡されたクラスのメソッドを読み取り、実行時にすべてを単一のセレクターにマップしてから、元のセレクターに転送するように設定されたクラスがあります。
これは現在機能しますが、一度に実行できるのは1つのメソッドのみです。問題は、最初のメソッドをスウィズすると、メソッドをキャッチして転送するIMPが他のメソッドIMPと交換されたことにあるようです。新しく交換されたIMPを使用して他のIMPを置き換えるため、この失敗をさらに試みることはできません。
1)つまり、MethodA、MethodB、およびCustomCatchAllMethodがあります。
2)MethodAをCustomCatchAllMEthodと交換します。MethodA-> CustomCatchAllMethod、CustomCatchAllMethod-> MethodA
3)CustomCatchAllMethodを使用してMethodBにスワップしようとしましたが、CustomCatchAllMethodがMethodAになっているため、MethodBはMethodAおよびMethodA->MethodBになります。
では、インターセプトする新しいセレクターごとに、IMPの新しいインスタンスを取得/コピーするにはどうすればよいですか?
上記のフローの大まかなモックアップは次のとおりです。