2

forwardInvocation:を使用して、Objective-CでOpenStructのクローンを作成しています。ただし、コンパイラはコンパイル時に転送を認識していないようです。ARC でコンパイルすると、大量の警告が表示されます。

コードはオープン ソースであり、Githubで入手できますが、現在は -fno-objc-arc でコンパイルされています。この ARC と互換性を持たせる方法を誰かが見てくれたら、とてもありがたいです。

4

1 に答える 1

3

私はこのコードを試しました:

OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary];
NSLog(@"%@ says %@", @"Cow",  [myStruct cowSound]);

LLVM 3.0 または LLVM GCC 4.2 で、ARC の有無にかかわらず、警告またはエラーが発生します。forwardInvocation: は、メッセージを送信するクラスのカテゴリ (@interface) でのみ、あるレベルでメソッドを宣言する必要があることを誤解していると思います。

たとえば、次の場合:

[someObject doSomething];

次に、someObject クラスが forwardInvocation を実装しているかどうかに関係なく、doSomething がどこにも宣言されていない場合、少なくとも警告 (「someObject は doSomething に応答しない可能性があります」) を常に生成します。お気づきのように、コンパイラは実際に転送を認識していません。また、 forwardInvocation の実装がメッセージ配信を保証することを信頼することもできません。ARC の有無にかかわらず、LLVM 3.0 では、代わりにエラーを生成するように変更されている可能性があります。これは、ARC の開発目標が、実行時の問題ではなく、より多くのコンパイラ エラーの側で誤りを犯すことであったためです。

メソッドを実装していないオブジェクトにメッセージを送信できるようになりました。たとえば、Objective-C ランタイム メソッドobjc_msgSendを使用するか、NSInvocationを使用します。しかし、それでは、作成しようとしていた使いやすいインターフェイスが無効になります。

ところで、OpenStruct の使用例は、[struct getValueForKey:@"moo"]; …これをよく考えてみると、[struct moo] は最初のアプローチよりもユーザーにほとんど、またはまったくメリットをもたらしません。「moo」メソッドはどちらの方法でも (文字列または転送されたメッセージ) 動的であり、実行時にタイプミスが検出されることはありません。

于 2011-11-03T22:21:14.110 に答える