Próbuję nieco lepiej zrozumieć środowisko wykonawcze Objective-C. Rozważmy NSAttributedString.h
, który ma minimalny interfejs, a następnie szerszą kategorię NSExtendedAttributedString
.Dlaczego nie mogę uzyskać mojej metody instancji kategorii nawet po jej wywołaniu?
Teraz rozważmy następujący kod:
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
znajdziemy metodę instancji, który jest częścią interfejsu kanonicznej, ale nie jeden w tej kategorii. Jak to się dzieje, a jednak można go z powodzeniem nazwać? Czy istnieje sposób introspekcji i znalezienia metody kategorii?
Ale initWithAttributedString jest zdefiniowany w kategorii NSAttributedString, a nie NSConcreteAttributedString. –
Dobra rozmowa i dobre przypomnienie, aby nie oczekiwać, że tylko dlatego, że przydzielisz/zainicjujesz coś, otrzymasz coś z tej klasy. –
Wiedziałem, że 'initXXX' może zwrócić inny obiekt, ale tutaj' [NSAttributedString alloc] 'zwraca już instancję' NSConcreteAttributedString'. Nie zauważyłem wcześniej tego zachowania! –