我在项目中使用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!
有人有同样的问题吗?
非常感谢你的帮助!
答案 0 :(得分:0)
三点:
1-您应该检查[NSString class],即公开的属性类,而不是针对您当前属性的类。
想象一下当您检查值类而不是属性类时会发生什么:在将属性设置为NSMutableString(NSString的完美实例)后,您不能再将其设置为常规NSString(因为NSString)不是NSMutableString的子类)。您当前的问题是本段中描述的问题的变体,可能更容易理解。
2-测试应该在拥有该属性的类中完成,而不是像现在这样在外面进行。因为只有那个类有权知道它所接受的对象的类型。
3-所以使用标准的validateValue:forKey:error:方法,这是你的朋友。这个方法将由类实现,它将确保注释是NSString。在类之外,您不会直接检查值的类型,而是要求容器类验证它。
瞧!