Я знаю Apple has cautioned против использования. Но, учитывая их аргументацию, результаты далеко не актуальны и ожидаются.Почему isKindOfClass и isMemberOfClass плохо работают с NSString и NSMutableString?
Вот мой отладочный вывод - результаты не отличаются в коде - ниже только для краткости:
(lldb) po [@"Hello" isKindOfClass:[NSMutableString class]]
true => A mutable string?
(lldb) po [[@"Hello" mutableCopy] isKindOfClass:[NSMutableString class]]
0x00000001019f3201 => What's that?
(lldb) po [[@"Hello" mutableCopy] isMemberOfClass:[NSMutableString class]]
0x000000010214e400 => What's that?
(lldb) po [@"Hello" isMemberOfClass:[NSMutableString class]]
false => Once again?
В дополнение к этому, я удалил все строки буквенный код и протестировали следующий:
NSMutableString * m = [[NSMutableString alloc] initWithString:@"Hello"];
bool b = [m isKindOfClass:[NSMutableString class]];
NSLog(@"%d", b); --> 1 Expected.
b = [m isKindOfClass:[NSString class]];
NSLog(@"%d", b); --> 1 Expected.
b = [m isMemberOfClass:[NSString class]];
NSLog(@"%d", b); --> 0 Expected.
b = [m isMemberOfClass:[NSMutableString class]];
NSLog(@"%d", b); --> 0 Not Expected.
Есть ли просвещение?
UPDATE:
компании Apple самостоятельно принять:
Будьте осторожны при использовании этого метода на объектах, представленных в классе кластера. Из-за природы кластеров классов объект, который вы получаете , может не всегда быть типом, который вы ожидали. Если вы вызываете метод , который возвращает кластер классов, точный тип, возвращаемый методом, является лучшим индикатором того, что вы можете сделать с этим объектом.
Почему бы просто не сказать, не используют isKindOfClass
и isMemberOfClass
с кассетными классами?
Объяснение предотвращает использование с точки зрения, такие как:
Вы могли бы закончить изменения то, что вы не должны.
вместо указания:
Эти методы не работают с кластерами класса. (в примерах, я показал выше - я четко передавая нужные объекты и до сих пор не получают ожидаемых результатов.)
UPDATE 2:
Поданный с Apple Radar.
Добавить 'NSLog (@" m class is% @ ", [m class]);'. Вероятно, вы обнаружите, что это не совсем «NSMutableString», поэтому ваш последний тест терпит неудачу. – rmaddy
BTW - 'isMemberOfClass:' и 'isKindOfClass:' return 'BOOL' поэтому используйте' p', а не 'po' в отладчике для печати значения результата. – rmaddy
Я знаю свой кластер классов - это происходит с NSNumber и NSArray тоже по той же причине. Но я хочу знать, что такое рассуждение Apple за методами передачи, которые вводят в заблуждение. Чтение свойства (класса) может иногда вводить в заблуждение. И это определенно внедорожная вещь, чтобы заменить isKindOfClass только для каких-то объектов. Я очень сомневаюсь, что responseSoSelector является надежным, учитывая приведенные выше результаты? –