Из isKindOfClass: документация метода в NSObject:
Будьте внимательны при использовании этого метода для объектов, представленных кластером классов. Из-за природы кластеров классов возвращаемый объект не всегда может быть типом, который вы ожидали.
В документации далее приводится пример того, почему вы никогда не должны спрашивать что-то вроде следующего экземпляра NSArray:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Теперь, чтобы привести пример другого использования, скажем, у меня есть экземпляр NSObject, где я хотел бы определить, есть ли у меня NSString или NSArray.
Оба эти типа являются кластерными классами, но, как видно из вышеприведенной документации, опасность заключается в ответе на isKindOfClass: слишком утвердительно (ответив ДА иногда, когда у вас действительно нет изменяемого массива), но задавая вопрос о простое членство в кластере все равно будет действительным.
Пример:
NSObject *originalValue;
// originalValue gets set to some instance
if ( [originalValue isKindOfClass:[NSString class]] )
// Do something with string
Правильно ли это предположение? Действительно ли безопасно использовать isKindOfClass: против экземпляров кластера классов для определения членства? Меня особенно интересует ответ на вездесущие NSString, NSArray и NSDictionary, но мне было бы интересно узнать, может ли он быть обобщенным.