2013-08-03 10 views
9

私は大きなナンデの牧場の本を使って客観的なことを教えようとしていますが、それは本当に素晴らしい本ですが、特定の面が私を混乱させます。Objective-C setValue:cプリミティブ型のforKey

現在の章では、setValueの使用について説明しています。forKey関数は、NSObjectで定義されているメソッドです。この本は、私がアプライアンスとそれに呼ばれるカスタムクラスは、の電圧を保持電圧呼ば整数インスタンス変数である必要がありますが、intやfloat型などのプリミティブ交流にこれを使用することができますことを言うと、この例に

を与えます現在のアプライアンス 私は

appliance *a = [[appliance alloc]init]; 
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"]; 

と呼ばれる新しいアプライアンスを初期化し、彼はその後、電圧のカスタムセッターを設定し、そのそれが

-(void)setVoltage:int(x) { 
NSLog(@"setting voltage to %d",x); 
voltage =x; 
} 
を動作するか検証するために呼び出されたときの電圧を記録します

NSNumberのnumberWithIntは、ヒープに格納されているNSNumberオブジェクトへのポインタを返します。それでは、%dトークンを使ってNSNumberに格納されている整数をどのように記録するのですか?私はそれが整数を記録するが、渡されるオブジェクトではないことを理解していますか?さらに、電圧は整数であり、何かへのポインタではないので、メモリ内のオブジェクトにアドレスを保持できないと考えました。または実際に電圧がポインタとして宣言されることなくメモリアドレスを保持するように強制するNSNumberの種類ですか?

この章は基本的に私のお尻を蹴って混乱して申し訳ありません。

+3

通常のコーディング方法では、* setValue:forKey: 'や' valueForKey: 'を使ってオブジェクト*の値を設定/取得しないことに注意してください。 setter/getterを直接呼び出してください。 KVCは、バインディングや他の形式のメタプログラミングなどのものをサポートするために主に存在します。 – bbum

答えて

25

オブジェクトとスカラー型間の変換は、Key-Value Codingメソッドによって自動的に処理されます。 documentationから:

valueForKey:setValue:forKey:のデフォルト実装は、非オブジェクトデータ 型、スカラおよび構造体の両方の自動オブジェクトラッピングのためのサポートを提供します。 valueForKey:一旦

が指定 キーの値を供給するために使用される特定のアクセッサメソッドまたは インスタンス変数を決定し、それは、リターンタイプまたはデータタイプを調べます。 の値がオブジェクトでない場合は、NSNumberまたはNSValueオブジェクトが作成され、その値の がその場所に返されます。

同様に、setValue:forKey:は、 で指定されたキーの適切なアクセサまたはインスタンス変数で必要なデータ型を決定します。 データ型がオブジェクトでない場合、適切な-<type>Valueメソッドを使用して、 渡されたオブジェクトから値が抽出されます。

だからあなたの場合には、intValueは、渡されたNSNumber オブジェクトに自動的に適用され、そして得られた整数がsetVoltage:に渡されます。

4

NSNumberインスタンスを作成し、それを渡しているという点で正しいです。しかし、あなたはそれをsetValue:forKey:に渡しており、あなたのためにいくつかの仕事をしています。voltagesetVoltage:)の適切なセッターメソッドを見つけ、セッターを呼び出す前にデータ型をチェックし、数値をintにアンボックスします。

関連する問題