discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Replacement for descriptionForInstanceMethod:


From: Fred Kiefer
Subject: Re: Replacement for descriptionForInstanceMethod:
Date: Tue, 8 May 2018 19:23:12 +0200


> Am 08.05.2018 um 19:16 schrieb Andreas Höschler <ahoesch@smartsoft.de>:
> 
> 
>> You should have a look at GSProtocolGetMethodDescriptionRecursive in 
>> Additions/GSObjCRuntime.m. I think this should be able to provide the 
>> required functionality.
> 
> Thanks a lot. I do
> 
>          NSMethodSignature *objcSignature = nil;
>          #ifdef __APPLE__
>            {
>             struct objc_method_description *methodDescription = NULL;
>             methodDescription = [_protocol 
> descriptionForInstanceMethod:aSelector];
>             if (methodDescription == NULL) methodDescription = [_protocol 
> descriptionForClassMethod:aSelector];
>             if (methodDescription != NULL) types = methodDescription->types;
>            }
>          #else
>            {
>             struct objc_method_description desc;
>             desc = GSProtocolGetMethodDescriptionRecursive(_protocol, 
> aSelector, YES, YES);
>             if (desc.name == NULL && desc.types == NULL)
>               {
>                desc = GSProtocolGetMethodDescriptionRecursive(_protocol, 
> aSelector, YES, NO);
>               }
>             types = desc.types;
>            }
>          #endif       
>          if (types) objcSignature = [NSMethodSignature 
> signatureWithObjCTypes:types];
> 
> now. The Apple part works on Macs and with my ancient GNUstep tree. I do not 
> know yet, whether the non-Apple part works on Ubuntu (current GNUstep) but 
> will try once the SIGSEGV problem is figured out. :-)
> 
> It's a little surprising to me why
> 
>> 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));
> 
> does not work on Apple as I understood this was the recommended way to do it 
> now!? But it simply does not work, therefore reverting back back to the 
> deprecated approach (deprecated descriptionForInstanceMethod: method of 
> Protocol).

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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]