> 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

Reply via email to