KVC valueForKey返回__NSCFConstantString而不是__NSCFString

时间:2012-05-10 14:35:43

标签: kvc

我在项目中使用KVC。

而且,在我的一个课程中,我写了这个属性:

@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 ...

beurk!

有人有同样的问题吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

三点:

1-您应该检查[NSString class],即公开的属性类,而不是针对您当前属性的类。

想象一下当您检查值类而不是属性类时会发生什么:在将属性设置为NSMutableString(NSString的完美实例)后,您不能再将其设置为常规NSString(因为NSString)不是NSMutableString的子类)。您当前的问题是本段中描述的问题的变体,可能更容易理解。

2-测试应该在拥有该属性的类中完成,而不是像现在这样在外面进行。因为只有那个类有权知道它所接受的对象的类型。

3-所以使用标准的validateValue:forKey:error:方法,这是你的朋友。这个方法将由类实现,它将确保注释是NSString。在类之外,您不会直接检查值的类型,而是要求容器类验证它。

瞧!