9

わかりました、なぜ私がこれについてそんなに混乱しているのか、皆さんはすぐに指摘できると思いますが、なぜ以下がコンパイラエラーまたは警告にならないのかについて質問があります:

NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];

selectedObjectは でありNSObjectnameたまたま@propertyタイプの の名前ですint

私を困惑させているのは、コンパイラがの呼び出しでメッセージをチェーンするために、 の戻り結果が (型キャストせずに) 型で[ self.selectedObject valueForKey:name ]あると完全に仮定する理由です。NSNumber *integerValue

明らかに、KVC は非オブジェクトの「数値」型を にラップしますが、この特定のケースでが返されるNSNumberことをコンパイラが知る方法はありません。-valueForKey:NSNumber *

idこれにより、 「 ' ' に応答しない可能性があります」という行に沿ってコンパイラの警告が表示されないのはなぜ-integerValueですか?

4

2 に答える 2

11

私はそれが正しかったことを願っています: これはid「特別」だからです. このタイプのオブジェクトは、id任意のメッセージを送信できます。コンパイラによるチェックは行われず、実行時にすべてがチェックされます。または、言い換えると、id型は Objective-C の「動的型付け」部分であり、他のすべての型 ( などNSObject) は「静的型付け」部分です。

このようにして、静的型付けを使用する場所と動的型付けを使用する場所を選択できます。次のようなことを行うことは完全に合法です。

id str1 = @"Hello";
id str2 = [str1 stringByAppendingString:@", world"];

しかし、通常は文字列を s として「きつく」型付けします。これは、コンパイル時の静的型チェックの利便性が得られるためであり、このような状況NSStringのように、静的型付けが邪魔になる場合にのみ動的型付けに頼ります。valueForKey

于 2010-01-16T08:26:15.737 に答える