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