2009-06-30 6 views

答えて

387

objectForKey:は、NSDictionaryの方法である。 NSDictionaryは、インデックスを使用する代わりに、キーを使用して項目を区別する点を除いて、NSArrayと同様のコレクションクラスです。キーとは、あなたが提供する任意の文字列です。 2つのオブジェクトが同じキーを持つことはできません(NSArray内の2つのオブジェクトが同じインデックスを持つことはできません)。

valueForKey:は、KVC法です。これはANYクラスで動作します。 valueForKey:では、名前に文字列を使用してプロパティにアクセスできます。私はプロパティaccountNumberAccountクラスを持っているのであれば、たとえば、私が行うことができ、次のものが同等のセットです

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; 
Account *newAccount = [[Account alloc] init]; 

[newAccount setValue:anAccountNumber forKey:@"accountNumber"]; 

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"]; 

:KVCを使用して

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; 
Account *newAccount = [[Account alloc] init]; 

[newAccount setAccountNumber:anAccountNUmber]; 

NSNumber *anotherAccountNumber = [newAccount accountNumber]; 

が、私は動的プロパティにアクセスすることができますステートメント。

私はあなたが思っていることを知っています:うわー、しかし皮肉です。 KVCはそれほど役に立たないとは思わない。実際、それは "言葉"に見えます。しかし、実行時に変更する場合は、他の言語でははるかに難しいクールなものをたくさんすることができます(しかし、これはあなたの質問の範囲外です)。

KVCの詳細については、Scott Stevenson's blogのGoogleの場合は多くのチュートリアルがあります。 NSKeyValueCoding Protocol Referenceもご覧ください。

希望に役立ちます。ここで

+12

valueForKeyは、キーが@記号で始まるかどうかによってNSDictionaryオブジェクトの動作が異なります。 – dreamlax

+57

objectForKey:文字列だけでなく、オブジェクトをキーとして受け入れます。唯一の要件は、鍵がNSCopyingプロトコルをサポートしていることです。 –

+0

これらの点はどちらも当てはまります。 NSDictionariesは特殊なケースであり、キーに文字列を使用する必要はありません。私は実際にどちらかの微妙なことには行きませんでした。なぜなら、質問者は単純な比較を必要としたように思えるからです。 –

61

valueForKey:を実行するときには、それにNSStringを渡す必要がありますが、objectForKey:は任意のNSObjectサブクラスをキーとすることができます。これは、Key-Value Codingの場合、キーは常に文字列であるためです。

は実際には、ドキュメントは、あなたがvalueForKey: NSStringのを与える場合でも、文字列は、@から始まるその場合には、例外を発生させることがvalueForUndefinedKey:を呼ぶ可能性がある、[super valueForKey:]を呼び出していない限り、それはとにかくobjectForKey:を起動すると述べています。

+0

あなたは私にあなたが意味するドキュメンテーションのリンクを教えてください。ありがとうございました。 –

+5

@ [ここにある](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/doc/uid/ 20000140-BBCIBCDJ) – dreamlax

20

objectForKey:可能な限りの代わりvalueForKey:使用する大きな理由だ - 不明なキーでvalueForKey:を「このクラスは、キー値コーディング準拠のキーのためではありません」と言ってNSUnknownKeyExceptionがスローされます。

+5

を参照してください。「valueForKey:未知のキーがあると、NSUnknownKeyExceptionがスローされます。「このクラスはキーに対応するキー値ではありません」 – onmyway133

10

このように、objectForKey:データ型は:(id)aKeyであり、valueForKey:データ型は:(NSString *)keyです。例えば

objectForKey:オブジェクトの任意の型を取る一方

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil]; 

NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]); 
    //This will work fine and prints ( 123 ) 

NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); 
    //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime. 

したがって、valueForKey:は、唯一の文字列値を取り、KVC方法であるだろう。

objectForKeyの値は、同じ種類のオブジェクトによってアクセスされます。