Le 8 juin 2010 à 19:23, James Bucanek a écrit :

> Nick Zitzmann <mailto:n...@chronosnet.com> wrote (Tuesday, June 8, 2010 9:27 
> AM -0600):
> 
>> On Jun 8, 2010, at 10:16 AM, James Bucanek wrote:
>> 
>>> I've been trying to track down a peculiar bug reported by a customer, and 
>>> I've narrowed it down to a problem returning a BOOL value via
>> -[NSObject performSelector:] on a dual Quad-Core Intel Xeon processor 
>> running 64-bit code. It seems that the returned value contains random data, 
>> which obscures the BOOL.
>>> 
>>> I've included the relevant code from the project below for completeness, 
>>> but the problem boils down to this statement:
>>> 
>>> if ([condition performSelector:conditionSelector]!=NO)
>> 
>> According to the documentation, that method returns an object, not a 
>> primitive. You can't use it if the selector returns a primitive; it doesn't 
>> work that way. If you want to call some selector and get a BOOL return 
>> value, then you must do this instead:
>> 
>> BOOL returnValue = ((BOOL (*)(id, SEL))objc_msgSend)(condition, 
>> conditionSelector);
> 
> For the record, the following is equivalent (i.e. produces the same machine 
> code) and is probably a little easier to read:
> 
>    BOOL returnValue = (BOOL)((uintptr_t)[condition 
> performSelector:conditionSelector]);

It's not more valid though. -performSelector must be used only with selector 
that return an object.

From the -performSelector reference:

"For methods that return anything other than an object, use NSInvocation."


-- Jean-Daniel




_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to