> Am 08.05.2018 um 19:26 schrieb Andreas Höschler <ahoe...@smartsoft.de>: > >> Most likely it isn’t working for the same reason as that code wasn’t working >> on GNUstep :-) >> The runtime function will only check for methods defined by the protocol >> directly not for inherited ones. That is why the GNUstep function has >> „recursive“ in its name. It is checking in the ancestry of the protocol. > > My test code was > > @protocol TestProtocol > > - (void)doIt; > > @end > > > Protocol *_protocol = @protocol(TestProtocol); > SEL aSelector = @selector(doIt); > struct objc_method_description _methodDescription = > protocol_getMethodDescription(_protocol, aSelector, NO, YES); > if (_methodDescription.name == NULL) _methodDescription = > protocol_getMethodDescription(_protocol, aSelector, NO, NO); > NSLog(@"_methodDescription.name %@", > NSStringFromSelector(_methodDescription.name)); > > Where is the ancestry here? Isn't "doIt" defined directly in this example?
Here is the GNUstep code for this function: struct objc_method_description GSProtocolGetMethodDescriptionRecursive(Protocol *aProtocol, SEL aSel, BOOL isRequired, BOOL isInstance) { struct objc_method_description desc; desc = protocol_getMethodDescription(aProtocol, aSel, isRequired, isInstance); if (desc.name == NULL && desc.types == NULL) { Protocol **list; unsigned int count; list = protocol_copyProtocolList(aProtocol, &count); if (list != NULL) { unsigned int i; for (i = 0; i < count; i++) { desc = GSProtocolGetMethodDescriptionRecursive(list[i], aSel, isRequired, isInstance); if (desc.name != NULL || desc.types != NULL) { break; } } free(list); } } return desc; } As you can see, the difference must either be in the recursive call or in the isRequired parameter. You could try to set that to YES for your direct call. _______________________________________________ Discuss-gnustep mailing list Discuss-gnustep@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnustep