1

KVC に似た方法で、メッセージ名をキー自体として使用する方法はありますか? たとえば、ではなくvalueForKey:、オブジェクトがすべてのメッセージに応答する方法はありますか?

たとえば、次の XML ドキュメントがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ...>
<employees>
  <employee>
    <name>Bill</name>
    <department>Accounting</department>
  </employee>
  <employee>
    <name>John</name>
    <department>Human Resources</department>
  </employee>
</employees>

すでに利用可能な NSXMLDocument などを使用する以外に、ある種の抽象化を実装する方法があるので、次のことができます。

MyXML *xmlDoc = [[MyXML alloc] initWithContentsOfFile:@"test.xml"];

NSLog (@"%@", [[[xmlDoc employees] first] department]);

[[[xmlDoc employees] first] setDepartment:@"Management"];

例として XML を選択しましたが、これが可能かどうか、Objective-C ランタイムに近づきすぎているかどうか、ランタイム自体でサポートされているかどうか、どのようにすればよいかを知りたいです。このようなものを実装することについて。これは純粋に実験的な目的のためであり、かなりのパフォーマンス コストが発生する可能性があることを理解しています。

編集:
可能であれば、Cocoa などの既存のフレームワークを避けて、基本の Objective-C object を使用したいと思いますObject

4

2 に答える 2

3

forwardInvocation:認識されないメッセージを実装して処理する必要がありmethodSignatureForSelector:ます。リファレンスに記載されていNSObjectます。

編集:ウィキペディアには、基本的に and を実装することにより、オブジェクトの転送を実現する方法の例があります。forward:performv:

于 2009-02-27T00:22:22.097 に答える
1

codelogicのおかげで、GCCのObjective-Cランタイムに必要なことは次のとおりです。

#import <obc/Object.h>
#import <stdio.h>

@interface RespondsToEverything : Object {}
@end

@implementation RespondsToEverything
- (retval_t) forward:(SEL) sel :(arglist_t) argFrame
{
    fprintf (stderr, "Received: %s\n", get_sel_name (sel));
}
@end

int main (int argc, char *argv[])
{
    id test = [RespondsToEverything new];
    [test asdfasdfasdfasdf];
    [test zxcvzxcvzxcvzxcv];

    return 0;
}

出力は次のとおりです。

Received: asdfasdfasdfasdf
Received: zxcvzxcvzxcvzxcv

しかしもちろん、GCCはとのメソッドシグネチャが見つからないと文句を言いasdfasdfasdfasdfますzxcvzxcvzxcvzxcv。大したことではありませんが、それでもコンセプトが実行可能であることを示しています。sel_getName(sel)Appleのランタイムでは、の代わりにを使用できますget_sel_name(sel)

于 2009-02-27T01:39:12.430 に答える