1

In the code below I thought the second condition would be true, but it is turning out as false. Am I missing something? Please help me understand.

NSArray *array = [[NSArray alloc] init];
NSLog(@"%@", NSStringFromClass([array class]));

if ([array isMemberOfClass:[NSObject class]]) {

    NSLog(@"Member NSObject"); //Didn't print; 
}

if ([array isMemberOfClass:[NSArray class]]) {

    NSLog(@"Member NSArray"); //Didn't print; I don't understand why?
}

if ([array isKindOfClass:[NSObject class]]) {

    NSLog(@"Kind of NSObject"); //Printed; Expected
}

if ([array isKindOfClass:[NSArray class]]) {

    NSLog(@"Kind of NSArray"); //Printed; Expected
}

Edit

I created sub class of NSArray as MyArray and tested its instance using isMemberOfClass as below

if ([myArray isMemberOfClass:[MyArray class]]) {

    NSLog(@"Member MyArray"); //Printed;
}

So, I guess isMemberOfClass not possible on NSArray, probably on some other framework classes as well.

Thanks.

4

3 に答える 3

3

これは正しい動作です。そのオブジェクトの実際のクラスを調べてみてください。

NSArray *array = [[NSArray alloc] init];
NSLog(@"%@", NSStringFromClass([array class]));

得られる出力は次のようなものです。

2013-02-15 23:42:31.272 Project[91998:c07] __NSArrayI

したがって、実際のクラスは__NSArrayI(のプライベート サブクラスNSArray) であり、NSArrayそれ自体ではありません。通常、isKindOfClass:より有用な結果が得られます。

于 2013-02-16T04:45:50.400 に答える
2

NSArray はクラス クラスタです。NSArray のオブジェクトを作成すると、内部的にそのクラスターからオブジェクトが作成されます。要件に応じて異なるタイプのオブジェクトを作成することを避けるために、単純さが追加されます。

そのような場合には、関数を使用する必要がありますisKindOfClass。完全な階層をチェックして、オブジェクトの種類を識別します。

于 2013-02-16T05:09:36.733 に答える
-1

isKindOfClass を使用する必要があります。違いはこちらをご参照ください。

于 2013-02-16T04:41:51.243 に答える