• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Creating an NSInvocation from an NSMethodSignature
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

References: 
 >Creating an NSInvocation from an NSMethodSignature (From: Mike Mangino <email@hidden>)
 >Re: Creating an NSInvocation from an NSMethodSignature (From: Michael Ash <email@hidden>)
 >Re: Creating an NSInvocation from an NSMethodSignature (From: Mike Mangino <email@hidden>)
 >Re: Creating an NSInvocation from an NSMethodSignature (From: Michael Ash <email@hidden>)
 >Re: Creating an NSInvocation from an NSMethodSignature (From: Greg Parker <email@hidden>)

  • Prev by Date: Re: Text encoding issues
  • Next by Date: Re: [iPhone] Caching images fetched from a URL?
  • Previous by thread: Re: Creating an NSInvocation from an NSMethodSignature
  • Next by thread: Re: Creating an NSInvocation from an NSMethodSignature
  • Index(es):
    • Date
    • Thread