Re: Creating an NSInvocation from an NSMethodSignature
Re: Creating an NSInvocation from an NSMethodSignature
- Subject: Re: Creating an NSInvocation from an NSMethodSignature
- From: Michael Ash <email@hidden>
- Date: Tue, 12 May 2009 22:19:54 -0400
On Tue, May 12, 2009 at 6:19 PM, Greg Parker <email@hidden> wrote:
> On May 12, 2009, at 6:43 AM, Michael Ash wrote:
>>
>> Use -methodForSelector: to get the IMP for a nonexistent method. This
>> IMP will be a function pointer straight to the runtime's forwarding
>> machinery. Then install that IMP as the implementation for your
>> overridden methods. Callers will go straight into the forwarding
>> machinery rather than into your overridden methods, which will then
>> invoke -forwardInvocation: as usual and you can then do as you like.
>
> This trick has a few platform- and architecture-specific pitfalls. Here's
> the safest way to do it:
>
> First: don't call that IMP directly. On some platforms it breaks C function
> rules, because it assumes it's being called from objc_msgSend.
>
> Second: don't do this for methods that return a struct. There may be two
> distinct forwarding IMPs, with -methodForSelector: returning the non-struct
> version. (By "struct return" I mean "method is called via
> objc_msgSend_stret()", which differs from "returns C struct" on some
> architectures.)
>
> Someday this will all work seamlessly, but currently all platforms and
> architectures suffer from at least one of the above.
Interesting stuff, thanks. I have a couple of questions, though:
1) Won't the inability to call the IMP directly make
-methodForSelector: almost completely useless? In theory, *any* method
could be implemented using forwarding. You simply can't know in
advance. If such an IMP can't be used in confidence for a forwarded
method, then -methodForSelector: can't be used to cache an IMP for any
method you didn't write yourself. Obviously it could still be used for
this case, where the returned IMP is only used for building a class's
method tables, but usually the IMP is obtained with the intention of
calling it directly.
2) Am I correct in assuming that if you grab the method signature and
then conditionally call either class_getMethodImplementation or
class_getMethodImplementation_stret that you avoid the problem of
getting the non-struct version of the forwarder for struct-returning
methods?
Mike
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden