【发布时间】:2010-11-08 23:12:25
【问题描述】:
来自isKindOfClass: method documentation in NSObject:
在类簇表示的对象上使用此方法时要小心。由于类簇的性质,您返回的对象可能并不总是您期望的类型。
文档接着给出了一个示例,说明为什么你永远不应该询问类似 NSArray 实例的以下内容:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
现在举一个不同用途的例子,假设我有一个 NSObject 实例,我想确定我是否有一个 NSString 或 NSArray。
这两种类型都是类集群 - 但从上面的文档看来,危险在于 isKindOfClass 的答案:过于肯定(有时当你真的没有可变数组时回答是)而询问关于集群中的简单成员资格仍然有效。
一个例子:
NSObject *originalValue;
// originalValue gets set to some instance
if ( [originalValue isKindOfClass:[NSString class]] )
// Do something with string
这个假设正确吗?使用 isKindOfClass: 针对类集群实例来确定成员资格真的安全吗?我对无所不在的 NSString、NSArray 和 NSDictionary 的答案特别感兴趣,但我很想知道它是否可以推广。
【问题讨论】:
-
在这 3 年的时间里,您是否对此有所了解?什么样的愚蠢
NSMutableArray子类不会是可变的? -
从实际经验来看,这并不重要;正如你所说,我只见过可变的 NSMutableArrays,而且我认为我从未使用过子类(至少是由第三方制作的)。 Objective-C 的很多内容都是关于不明确的约定,我认为您可以确定您可能遇到的任何 NSMutableArray 子类的行为方式对任何其他 Objective-C 程序员都有意义。不过,我还应该补充一点,我没有遇到过必须进行类似检查的情况——任何数据流动的路径都应该始终是可变的或不可变的。
-
同意,当您阅读 API 时,这是一种边缘问题,但在野外很少出现。对我来说,这属于“不要在
else条件没有意义的情况下编写if”或类似的更大类别。
标签: objective-c