0

我在我的项目中使用 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 ...

伯克!

有人有同样的问题吗?

非常感谢你的帮助 !

4

1 回答 1

0

三点:

1- 您应该检查 [NSString class],您的财产的公开公开类别,而不是您财产当前价值的类别。

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

2-测试应该在拥有财产的班级中进行,而不是像现在这样在外面进行。因为只有那个类才有权知道它接受的对象的类型。

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

瞧!

于 2012-05-11T05:50:23.090 回答