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 を返す必要がありますが、NSString はオブジェクトの正確なタイプではないため、isMemberOfClass: は false を返します。

于 2009-08-13T03:36:40.313 に答える
2

NSStringクラスのクラスターで構成されています。CFStringそれらはまた、 s (から)で無料でブリッジされCoreFoundationます。NSStringこれは実装のどこかにNSCFString現れる可能性が非常に高いです (私はすべての事実を知っているわけではありませんが、ここでの私の推論は、このクラスがブリッジとして機能することです)。

于 2009-08-13T03:29:10.080 に答える