2013-04-19 12 views
5

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?

Odpowiedz

3

Co się dzieje w tym przypadku jest to, że można zakładać attributedString być typu NSAttributedString, który nie jest w przypadku:

NSLog(@"Class: %@", [attributedString class]); 

// Produces this output 
2013-04-19 19:50:21.955 TestApp[1611:303] Class: NSConcreteAttributedString 

Jeżeli zmienisz NSAttributedString.class w kodzie do [attributedString class] będzie działać zgodnie z oczekiwaniami.

+0

Ale initWithAttributedString jest zdefiniowany w kategorii NSAttributedString, a nie NSConcreteAttributedString. –

+0

Dobra rozmowa i dobre przypomnienie, aby nie oczekiwać, że tylko dlatego, że przydzielisz/zainicjujesz coś, otrzymasz coś z tej klasy. –

+1

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! –

Powiązane problemy