問題タブ [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.

0 投票する
2 に答える
744 参照

java - Javaによる自動ポインタスウィズリング?

次のようなノードとポインターで表される任意のグラフがあるとします。

ここで、そのコピーを取得するか、ディスクに書き込み/読み取りを行いたいと考えています (AKA シリアライズ/デシリアライズ)。また、検索アルゴリズム + 連想配列を使用して実行できることも知っています。そして、この方法はスウィズリングと呼ばれていることがわかりました。

ここに私の質問があります:

Java では、クラスを Serializable として宣言することにより、この機能が自動的に提供されると聞いています。(私には魔法のように聞こえます!)

この記述は正しいですか?Java は自動的に BFS を実行してグラフをトラバースし、ポインターをスウィズルしますか? 言い換えれば、シリアル化/逆シリアル化はオブジェクトのクローンを作成しますか? (同じ構造で新しいノードと更新されたポインタを持つ完全に新しいオブジェクト)

はいの場合、ポインタをコピーしたいだけの場合はどうなりますか? 元のポインターを保持するためだけにオブジェクトをシリアル化したい場合はどうすればよいですか?

これについてのコメントをお待ちしております。:-)

0 投票する
3 に答える
5831 参照

objective-c - クラスではなく単一のインスタンスをスウィズルする

私は NSObject のカテゴリを持っています。オブジェクトでそれを呼び出すとき、その dealloc メソッドをオーバーライドしてクリーンアップを行いたいと考えています。

メソッドスウィズリングを使用してやりたかったのですが、方法がわかりませんでした。私が見つけた唯一の例は、クラス全体のメソッド実装を置き換える方法に関するものです (私の場合、すべての NSObject の dealloc をオーバーライドしますが、これは望ましくありません)。

NSObject の特定のインスタンスの dealloc メソッドをオーバーライドしたいと考えています。

0 投票する
1 に答える
1090 参照

objective-c - 動的ライブラリを使用した Objective C メソッドのスウィズリング

メソッドスウィズリングを学ぼうとしています。クラス内のメソッドを呼び出すだけの目的の C でプログラムを作成しました。現在、DYLD_INSERT_LIBRARIES を使用して動的ライブラリをロードしようとしているため、動的ライブラリで定義されている新しいメソッドでメソッドの実装をオーバーライドできます。目的は、引数を変更してから、元の関数呼び出しを呼び出すことです。

プログラム コードは、http://pastebin.com/a0b3qkgB で入手できます。ダイナミック ライブラリのコードは、http: //pastebin.com/Ndf6VdUtで入手できます。

行「if (self == [Encryption class]) {」が動的ライブラリで実行されるとすぐに、コードにクラス名が表示され、奇妙なメッセージが吐き出されることがわかりました。完全な出力:

コードの何が問題なのかわかりません。どんな助けでも大歓迎です。

目的は、動的ライブラリ (コード インジェクション) を使用して目的の C メソッドをオーバーライドすることです。

0 投票する
2 に答える
544 参照

objective-c - Lion / Xcode 4.3.1 での ShareKit メソッドのスウィズリング?

最近、iOS 5 SDK を使用して Lion と Xcode 4.3.1 にアップグレードしましたが、共有ライブラリのShareKitが壊れています。メール ハンドラーにメソッド スウィズリングを使用していました。どうやら Apple は、メソッドの入れ替えを禁止するか、少なくとも段階的に廃止しようと試みているようです。

ShareKit は、</usr/include/objc/objc-class.h>もはや存在しないファイルをインポートし、独自のメソッド スウィズリング メソッドを定義しますSHKSwizzle。これを使用して、MFMailComposeViewControllerviewDidDisappear:メソッドを次のように変更します。

これを回避するための最善かつ最も簡単な方法は何だと思いますか?

0 投票する
1 に答える
263 参照

objective-c - UITableViewCellAccessoryType の問題を引き起こす UIButton のスウィズリング

UIButtonが trueの場合に 'sをスウィズルするクラスbuttonTypeUIButtonTypeCustomあります。ただし、これは、使用される場合にも当てはまりUITableViewCellAccessoryCheckmarkますUITableViewCellAccessoryDisclosure。何が起こっているかというと、何らかの理由で、それらをスウィズルして、何らかの理由でカスタム背景などを背後に追加しているというaccessoryTypeことです。

UIButton私がする必要があるのは、スウィズルしようとしている が であるかどうかを確認することですが、UITableViewCellAccessoryTypeそのようなことを行う方法がわかりません。

をスウィズルするために使用している関数の内部は次のとおりUIButtonです。

どんな助けでも大歓迎です!

0 投票する
2 に答える
1270 参照

objective-c - ファインダーでスウィズリングするSIMBL

MacOsFinderのドロップボックスのようなアイコンオーバーレイをSIMBLプラグインと統合することができました。swizzleメソッドを使用して、いくつかのファインダー関数をオーバーライドします。

これが私のスウィズルメソッドです:

したがって、今のところ、次のようにdrawWithFrameメソッドをオーバーライドします。

すべてのアイコンが表示されますが、デスクトップやアイテムをアイコンとして表示するビューには表示されません...なぜですか?

ありがとうございました 、

0 投票する
1 に答える
2417 参照

objective-c - 私のisa-swizzlingはKVOを壊します

特定のオブジェクトのdeallocメソッドでいくつかのアクションを実行する必要があるため、isaスウィズリングを実装しようとしています。私はオーバーライドしています-(クラス)クラス; 元のクラスを返すメソッド(KVOのように)。スウィズルされたオブジェクトにオブザーバーを追加しようとするまで、すべてが正常に機能します。クラッシュするだけです。

  1. 0x00000000の0x00000000()
  2. _NSKeyValueRetainedObservationInfoForObjectの0x0091d22a()
  3. 0x0092ec88 in-[NSObject(NSKeyValueObserverRegistration)_addObserver:forProperty:options:context:]()
  4. 0x0092d6fd in-[NSObject(NSKeyValueObserverRegistration)addObserver:forKeyPath:options:context:]()

これがスウィズリングの実装です

MDDummyは、従来の方法でクラスを保持するメソッドにすぎません(これとraw関数の追加に違いはありません)。

編集:

class_addMethodFromClass関数の実装は次のとおりです。

0 投票する
2 に答える
2023 参照

objective-c - NSArray (または他のクラス クラスター) をモンキー パッチまたはスウィズルする方法はありますか?

今日、私は のすべてのインスタンスに対して代替メソッドを「エイリアス」したいプロジェクトに取り組んでいましたが、古き良きメソッドのスウィズリングNSArrayではそれほど難しいとは思いませんでした。

私はJRSwizzleを始めて…</p>

[NSArray jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(objectAtIndex_accordingToMe:) error:nil];

NSArray明確にするために、これを適切なカテゴリ on 、 と呼ばれるインスタンス メソッドと組み合わせましたobjectAtIndex_accordingToMe:

ただし、同じ古​​い index で、同じ古いオブジェクトを取得していました。はぁ。最終的に、エラーをスローしていないにもかかわらず、クラスクラスターであるため、これらの結果を達成できないことがわかりましたNSArray

私の質問は、「これ」が実際にNSArrayメソッドをオーバーライドしようとする道の終わりであることを受け入れたくないということだと思います。つまり、これはNSArray..人々はそれをいじりたがっているに違いありません。Apple の基礎クラスは、世界中のスウィズラーにとって主要なターゲットになると考える人もいるでしょう。

それで、変更、エイリアス、monkey-patch、オーバーライド、またはその他の方法で…NSArrayなどを(サブクラス化せずに)使用する方法はありますか?

0 投票する
1 に答える
1257 参照

objective-c - iOSがファイルの読み取りと書き込みに使用する関数/システムコール

一部のアプリに透過的な暗号化/復号化機能を提供するために、iOSでファイルの読み取り/書き込みをインターセプトしたいと思います。

これを行うためにファイルを読み書きするためのさまざまなSDKメソッドをスウィズルできることは知っていますが、これには多くのハードワークが必要であり、エラーが発生しやすくなります(一部のメソッドのスウィズルを見逃して、アプリケーションがクラッシュ/誤動作する可能性があります)。

これらすべてのメソッドで使用される一般的なシステムコール/関数がある場合は、それをスウィズルして、ハードワークを節約し、より確実なものにします。そのような一般的なエントリポイントはありますか?

PS:これらのアプリはすべて社内での展開用であるため、アプリストアへの受け入れはここでは基準ではありません。

ありがとう!

0 投票する
1 に答える
85 参照

objective-c - プロトコルの実装として使用して、すべてのオブジェクトのメソッドを置き換えることは可能ですか?

プロトコルの実装として使用して、すべてのオブジェクトのメソッドを置き換えることは可能ですか?

方法はcanPerformAction:(SEL)action withSender:(id)sender次のとおりです。

最初の問題:UIWebViewの「切り取り、コピー、貼り付け」および「選択、すべて選択」ポップアップメニューを無効にできない。奇妙なオブジェクトがそのcanPerformActionメソッドでそれらを生成します。そして、そのクラスでのみメソッドを置き換えるこのオブジェクトを見つけることができません。

どうぞよろしくお願いいたします。この問題を長い間解決することはできません。選択を無効にする他のすべての方法も、私のページでのユーザー入力を無効にします。canPerformActionそして、私はそれを機能させるために正しいクラスまたはすべてのクラスのメソッドを置き換えるだけかもしれません。