2010-12-08 6 views
5
NSDictionary *dict = [NSDictionary dictionary]; 
NSLog(@"%@", NSStringFromClass([dict class])); 

このコードは "__NSDictionary0"を出力します。NSDictionaryが異常なクラス名を報告するのはなぜですか?

自分のクラスでは、実際のクラス名を出力します。

NSDictionaryが__NSDictionary0として識別されるのはなぜですか?これに依存するのは安全ですか?

答えて

15

NSDictionaryはクラスクラスタです。ここではそれらについて読む:

Cocoa Fundamentals Guide

「実際の」クラス自体がプライベートであるため、いや、これに依存するは安全ではありません。

あなたのクラスは本当にNSDictionaryのかどう[dict isKindOfClass:[NSDictionary class]];

+4

そして、次の質問が「辞書が変更可能かどうかを判断しようとしています」とすれば、それはできません。 – bbum

+3

'isMemberOfClass:[NSMutableDictionary class]'を使用できませんか? – GendoIkari

+0

はい、isMemberOfClass:辞書が変更可能かどうかを判断するために使用できます。 – JustSid

20

NSDictionaryを使用し、知る必要がある場合Gendolkariが言ったとClass Clusters are documentedとして、クラスクラスタです。

また、プライベートサブクラスの正確な識別情報に依存することはできません。

あなたは確かにそれが辞書であるかどうかを決定するために次の操作を行うことができる必要があります:それはNSDictinoaryクラスの一部として実装された辞書であることを、少なくとも

[myThingaMaHoover isKindOfClass: [NSDictionary class]]; 

あるいは、クラスタ。

辞書(または文字列、配列、またはセット)が変更可能かどうかを判断するには、isKindOfClass:またはisMemberOfClass:を使用します。検討:

NSDictionary *d = [NSDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSMutableDictionary *m = [NSMutableDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"]; 
NSLog(@"d class: %@ %@ %@", [d class], [d superclass], [[d superclass] superclass]); 
NSLog(@"m class: %@ %@ %@", [m class], [m superclass], [[m superclass] superclass]); 

この出力:

d class: NSCFDictionary NSMutableDictionary NSDictionary 
m class: NSCFDictionary NSMutableDictionary NSDictionary 

dmは(NSDictionaryから継承)NSMutableDictionaryから継承NSCFDictionaryの両方のインスタンスです。

+0

+1。 – GendoIkari

1

したがって、基本的にNSMutableDictionaryまたは裸のNSDictionaryを使用しているかどうかを知る必要があります。または、知る必要はありません。またはオブジェクト(NSDictionaryまたはNSMutableDictionary)からNSMutableDictionaryを作成しますか?

何が元々の問題でしたか?

0

あなたは可変性をテストしたい場合は、あなたの最善の策は、おそらくconformsToProtocol次のようになります。@protocol(NSMutableCopying)

+1

NSDictionaryとNSArrayはNSMutableCopyingを確認します。 – Karmeye

0

NSDictionaryの可変性のテストのために、ただ唯一の方法は「respondsToSelector」にあなたをcould't NSMutableDictionaryはaddObjectのようになります:ForKey :?

関連する問題