0

私は自分のプロジェクトでKVCを使用しています。

そして、私のクラスの1つで、私はプロパティを書きました:

@property ( nonatomic, strong )             NSString            *notes;

そのプロパティにNSStringオブジェクトを入れたい:

そして、値を設定する前に、宛先のクラス名をテストしたいと思います。

a = [ newContainer valueForKey:@"notes"];
if( a != nil && ![ b isKindOfClass:[ a class ] ] )

// here b is the new NSString value

その結果、xcodeはクラスが同じではないことを示します!

(gdb) po [ b class ]
__NSCFString

(gdb) po [ a class ]
__NSCFConstantString

これはそれほど重要ではなく、__NSCFConstantStringはNSStringのプライベートサブクラスであることを読みました。

しかし、私の場合、オブジェクトを更新する前に、オブジェクトのすべてのプロパティを確認する必要があります。

そして、私は自分のコードに入れたくありません:

// OK, classes aren't the same ... 
// ---- BUT WE MUST test it again to know if a is a NSString and b a subclass of NSString or anything else ...

バーク!

誰かが同じ問題を抱えていますか?

あなたの助けをどうもありがとう!

4

1 に答える 1

0

3つのポイント:

1-プロパティの現在の値のクラスではなく、プロパティの公開されているクラスである[NSStringクラス]に対してチェックする必要があります。

プロパティクラスではなく、値クラスをチェックするとどうなるか想像してみてください。NSStringの完全なインスタンスであるNSMutableStringにプロパティを設定した後、通常のNSStringに設定できなくなりました(NSStringはNSMutableStringのサブクラス)。現在の問題は、この段落で説明されている問題の変形であり、理解しやすい場合があります。

2-テストは、現在行っているように外部ではなく、プロパティを所有するクラスで実行する必要があります。そのクラスだけが、受け入れるオブジェクトのタイプについて知る権利があるからです。

3-そう。ここでの友達である標準のvalidateValue:forKey:error:メソッドを使用します。このメソッドはクラスによって実装され、notesがNSStringであることを確認します。クラスの外では、値のタイプを直接チェックするのではなく、コンテナクラスに検証を依頼します。

そしてvoilà!

于 2012-05-11T05:50:23.090 に答える