Re: Re: Checking a method for parameter types via SEL
Re: Re: Checking a method for parameter types via SEL
- Subject: Re: Re: Checking a method for parameter types via SEL
- From: "Michael Ash" <email@hidden>
- Date: Mon, 31 Jul 2006 19:09:47 -0400
On 7/31/06, Tommy Nordgren <email@hidden> wrote:
This, to be extended with further methods:
@implementation NSCoder (ConditionalCoding)
-(void) encodeObject:(id) obj onCondition:(SEL) cond withOwner: (id)
owner
{
BOOL strongCode = NO;
NSMethodSignature * sign = [obj methodSignatureForSelector:cond];
if (sign == nil) {
strongCode = YES;
} else {
if ([sign numberOfArguments] == 3 &&
strcmp([sign getArgumentTypeAtIndex:2],@encode(id)) == 0 &&
strcmp([sign methodReturnType] , @encode(BOOL)) == 0) {
int i = (int) objc_msgSend(obj,cond,owner);
strongCode = i ? YES: NO;
}
}
if ( strongCode) {
[self encodeObject: obj];
} else {
[self encodeConditionalObject:obj];
}
}
@end
Why bother with this type checking only to have it fail silently
anyway? Much better would be to simply add this to the header:
// cond must return a BOOL and take a single id argument
If you insist on a runtime check then you should throw an exception or
something similar if the method signature does not match. Simply
taking a wrong signature as NO is going to create annoying and
difficult-to-find errors.
I should also note that your call to objc_msgSend is faulty. BOOL is
one byte, but int is four and id is also four. By using a function
declared to return id and casting its return value to int, you risk
picking up junk in the return value and getting false positives.
Instead, call it like this:
((BOOL (*)(id, SEL, id))objc_msgSend)(obj, cond, owner)
Mike
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden