0

次のように作成された NSMutableArray を取得しました。

NSMutableArray *expr = [[NSMutableArray alloc] init]; 
    [expr addObject:[NSNumber numberWithDouble:3.0]];
    [expr addObject:@"+"];
    [expr addObject:@"%x"];
    [expr addObject:@"*"];
    [expr addObject:[NSNumber numberWithDouble:4.0]];

後で、それを として知られているメソッドに渡し(id) anExpression、イントロスペクションを使用してこれがどの種類のオブジェクトであるかを判断しようとします。

if ([[anExpression class] isEqual:[NSMutableArray class]]) {
    // Some code I only want to do if it IS a Mutable array
}

しかし、それは false を返し、私のコードは実行されません。私は試してみNSLogまし[NSMutableArray class]たが、それは私に与えますNSMutableArray。それほど驚くことではありません。
しかし、 のクラスを試してみるとNSLogexprが得られ__NSArrayMます。

どうしてこれなの?これを回避するにはどうすればよいですか?

私はObjective-Cにあまり詳しくないので、説明してください。理解できないことをするのは好きではありません。

4

2 に答える 2

1

答えはisKindOfClassにあります。NSMutableArrayのサブクラスを作成した場合は、可変配列用に予約されたコードを実行する必要があることは明らかです。

同様に、作成した可変配列のクラスが[NSMutableArrayクラス]と異なる内部Cocoa実装の詳細が必要です。理由はわかりませんが、どちらも気にする必要はありません。ほとんどの場合、isKindOfClassを使用する必要があります。これはサブクラスでも機能します。

あなたが見つけたいと思っているなら...

そのすべてはクラスクラスターに関するものです-ObjectivecisKindOfClassの誤解を参照してください?

于 2012-06-26T15:57:58.567 に答える
1

あなたの小切手は間違っています。どちらかである必要があります

if ([[expr class] isEqual:[NSMutableArray class]]) {

また

if ([expr isKindOfClass:[NSMutableArray class]]) {
于 2012-06-26T15:47:14.830 に答える