isMemberOfClass:
вернет YES
только если класс экземпляра точно такой же, однако isKindOfClass:
вернет YES
, если класс экземпляра такой же, или подкласс данного класса.
Например, это выдаст No!
:
BOOL result = [[NSMutableArray array] isMemberOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
Но это выдаст Yes!
:
BOOL result = [[NSMutableArray array] isKindOfClass:[NSArray class]];
NSLog (@"%@", result? @"Yes!" : @"No!");
Это связано с тем, что NSMutableArray является видом NSArray, но не является членом класса NSArray (в противном случае это не будет NSMutableArray).
Повсюду в Foundation и Cocoa существует ряд «кластеров классов». Подробнее об этом вы можете прочитать в документации на сайте разработчика Apple . Из-за природы кластеров классов, если вы, возможно, создадите объект NSString
, он может не пройти тест isMemberOfClass:[NSString class]
.
Если ни isKindOfClass:
, ни isMemberOfClass:
не возвращают правильное значение, посмотрите, к какому классу относится фактический объект
NSLog(@"cat class = %@, dog class = %@", [cat className], [dog className]);
Если они возвращают что-то кроме того, что они должны, значит, есть проблема с вашим классом фермы.