Я пытаюсь немного лучше понять среду выполнения Objective-C. Рассмотрим NSAttributedString.h
с минимальным интерфейсом, за которым следует более обширная категория NSExtendedAttributedString
.
Теперь рассмотрим следующий код:
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithAttributedString:[[NSAttributedString alloc] initWithString:@"ABC"]];
NSLog(@"Result: %@", attributedString);
NSLog(@"Exists? %@", [NSString stringWithUTF8String:sel_getName(method_getName(class_getInstanceMethod(NSAttributedString.class, @selector(initWithAttributedString:))))]);
NSLog(@"Exists? %@", [NSString stringWithUTF8String:sel_getName(method_getName(class_getInstanceMethod(NSAttributedString.class, @selector(string))))]);
// Produces this output
2013-04-19 10:17:35.364 TestApp[53300:c07] Result: ABC{
}
2013-04-19 10:17:35.364 TestApp[53300:c07] Exists? <null selector>
2013-04-19 10:17:35.365 TestApp[53300:c07] Exists? string
Мы находим метод экземпляра, который является частью канонического интерфейса, но не тот, что в категории. Как это может происходить и при этом успешно вызываться? Есть ли способ самоанализа и поиска метода категорий?