2

メソッド スウィズリングを使用して、クラス内のすべてのメソッド呼び出しをいくつかの追加機能でラップしていました。具体的には:

  • このメソッド呼び出しに必要なオブジェクトがキャッシュにあるかどうかを確認しています
  • キャッシュにそのオブジェクトがあった場合は、それを返します。
  • そうでない場合は、元の実装にディスパッチし、キャッシュにデータを入力してそれを返します。

NSProxy を使用すると、より読みやすいコードが得られるかどうかを確認したいと思いました。さらに、NSProxy を使用すると、不明な数の引数を使用してメソッド呼び出しを簡単にリダイレクトできるのではないかと考えました。

したがって、NSProxy バージョンは、1 つの重要なキャッチを除いて正常に動作します。サブクラスの内部呼び出しはプロキシを経由しません。

代用インターセプターを作成する方法は次のとおりです。

- (id)init
{
    self = [super init];
    if (self)
    {
        TyphoonAssemblyProxy* proxy = [[TyphoonAssemblyProxy alloc] initWithAssembly:self];
        self = proxy; // 'self' should now be the proxy. . . but it seems not :(
    }
    return self;
}

内部呼び出し (つまり、プロキシされたクラス内の「self」への呼び出し) は、プロキシ経由でルーティングされません。

さて、プロキシされたクラスのサブクラスで、内部呼び出しをプロキシ経由にしたいコードがあります。しかし、そうではありません。

- (id)knight
{
    return [TyphoonDefinition withClass:[Knight class] properties:^(TyphoonDefinition* definition)
    {
        //THIS NEXT CALL TO [self defaultQuest] SHOULD GO THROUGH PROXY MACHINERY!
        [definition injectProperty:@selector(quest) withDefinition:[self defaultQuest]]; 
        [definition injectProperty:@selector(damselsRescued) withValueAsText:@"12"];
        [definition setScope:TyphoonScopeDefault];
    }];
}

質問:

これらの内部アクセスをプロキシ経由で取得する簡単な方法は何ですか?

4

1 に答える 1

1

その代わりに、メッセージ転送がうまくいくかもしれません。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

于 2014-05-09T11:46:03.553 に答える