2012-05-10 3 views
0

私は自分のプロジェクトでKVCを使用しています。KVC valueForKey代わりに__NSCFConstantStringを返す__NSCFString

そして、私のクラスの一つに、私は、プロパティを書いた:

と値を設定する前に、私がテストしたい:私はそのプロパティにNSStringのオブジェクトを配置する

@property (nonatomic, strong)    NSString   *notes; 

宛先のクラス名。

その結果、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 ... 

beurk!

誰も同じ問題がありますか?

ありがとうございました!

答えて

0

3点:

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

プロパティクラスの代わりに値クラスをチェックすると、NSStringの完全なインスタンスであるNSMutableStringにプロパティを設定した後、通常のNSStringに設定できなくなりますNSStringはNSMutableStringのサブクラスではありません)。あなたの現在の問題は、この段落で説明されているものの変形です。理解しやすくなります。

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

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

そしてvoilà!

関連する問題