2013-02-16 8 views
0

В приведенном ниже коде я думал, что второе условие будет истинным, но оно окажется ложным. Я что-то упускаю? Пожалуйста, помогите мне понять.использование isMemberOfClass; return false

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 
} 

Редактировать

Я создал вспомогательный класс NSArray в MyArray и испытания его экземпляра с помощью isMemberOfClass ниже

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

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

Итак, я думаю isMemberOfClass не возможно на NSArray, вероятно, на некоторых другие рамочные классы.

Спасибо.

ответ

2

Это правильное поведение. Попробуйте проверки фактического класса для этого объекта:

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

Выход вы получите что-то вроде:

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

Так фактический класс __NSArrayI (частный подкласс NSArray), не NSArray сам. Как правило, isKindOfClass: дает более полезные результаты.

+0

Как проверить NSArray для определенных не детей NSArray? – Saran

+0

Я не уверен, что понял вопрос. Вы спрашиваете, как найти объекты, чей класс * не является потомком 'NSArray'? Если это так, вы просто используете '! [Object isKindOfClass: [NSArray class]]'. –

+0

Я имею в виду, как точно тестировать конкретный класс, так как isKindOfClass скажет «Да», даже если он найдет его потомком. Я под впечатлением isMemberOfClass точно это сделает. – Saran

-1

Вы должны использовать isKindOfClass. Обратитесь к this за разницу.

2

NSArray - кластер классов. Когда вы создаете объект NSArray, он внутренне создает объект из своего кластера. Это добавляет простоты, чтобы избежать создания объектов различного типа в зависимости от требований.

Для таких случаев вы должны использовать функцию isKindOfClass. Он проверяет иерархию комплемента, чтобы определить тип объекта.