8

我有以下代码

NSMutableArray *mutArray = [[NSMutableArray alloc] init];
[mutArray addObject: [NSProcessInfo processInfo]];
[mutArray addObject: @"This is NSString Object"];
[mutArray addObject: [[NSMutableString alloc] initWithString: @"1st Mutable String"]];

for (id element in mutArray){
      NSLog(@" ");
      NSLog(@"Class Name: %@", [element className]);
      NSLog(@"Is Member of NSString: %@", ([element class] isMemberOfClass: [NSString class]) ? YES: NO);
      NSLog(@"Is kind of NSString: %@", ([element class] isKindOfClass: [NSString class]) ? YES: NO);
}

我得到以下输出(并期待指出)

Class Name: NSProcessInfo
Is Member of NSString: NO
Is Kind of NSString: NO

Class Name: NSCFString         <-- Expecting NSString
Is Member of NSString: NO      <-- Expecting YES
Is Kind of NSString: NO        <-- Expecting YES

Class Name: NSCFString         <-- Expecting NSMutableString
Is Member of NSString: NO      
Is Kind of NSString: NO        <-- Expecting YES

我在这里错过了一些可怕的简单事情吗?谢谢!

4

2 回答 2

17

采用:

[element isMemberOfClass: [NSString class]]

不是:

[[element class] isMemberOfClass: [NSString class]]

NSString 和 NSMutableString 被实现为一个类集群(参见文档的 iOS 版本中的“字符串对象” )。

所以 isKindOfClass: 应该返回 true 但 isMemberOfClass: 将返回 false 因为 NSString 不是对象的确切类型。

于 2009-08-13T03:36:40.313 回答
2

NSString由一组类组成。CFString它们也与s(来自CoreFoundation)进行免费桥接。很可能在这个实现的某个地方NSString出现NSCFString(我不知道所有的事实,但我在这里的推论是这个类充当了桥梁)。

于 2009-08-13T03:29:10.080 回答