On Feb 3, 2011, at 6:18 PM, Jeff Kelley wrote:
> I’m trying to use objc_msgSend_stret to call -bounds on a UIScreen. I have
> the following code:
>
>> SEL bounds = NSSelectorFromString(@"bounds");
>> CGRect screenBounds;
>> objc_msgSend_stret((void *)&screenBounds, screen, bounds);
>
> The declaration of objc_msgSend_stret in the Xcode code sense pop-up is as
> follows:
>
>> void objc_msgSend_stret(void * stretAddr, id self, SEL op, ...);
>
> But that’s not what message.h would leave me to believe (with some unrelated
> lines removed):
>
>> #if defined(__OBJC2__)
>> OBJC_EXPORT void objc_msgSend_stret(id self, SEL op, ...);
>> #else
>> /* For compatibility with old objc-runtime.h header */
>> OBJC_EXPORT void objc_msgSend_stret(void * stretAddr, id self, SEL op, ...);
>> #endif
>
> So, if the declaration is actually the first (I’m compiling for iOS 4.2, so
> I’m pretty sure __OBJC2__ is defined), how do you use it and get the return
> value of the function?
Both declarations are wrong: you cannot and must not call them directly. The
declaration of objc_msgSend_stret() cannot be expressed in C.
The correct way to call objc_msgSend_stret() or any other objc_msgSend()
variant is to cast it to an appropriate function pointer type. Like this:
CGRect (*msgSendFn)(id self, SEL _cmd);
msgSendFn = (CGRect(*)(id, SEL))objc_msgSend_stret;
CGRect screenBounds = msgSendFn(screen, @selector(bounds));
If the method had parameters, you would need to add them to the declaration of
the function pointer variable.
--
Greg Parker [email protected] Runtime Wrangler
_______________________________________________
Cocoa-dev mailing list ([email protected])
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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]