views:

629

answers:

1

Hey guys, I'm running the following code on my phone, where 'object' is a Cat, which is a subclass of Animal. Animal has a property 'color':

NSLog(@"Object: %@", object);
NSLog(@"Color: %@", [object color]);
NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:@selector(color)];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:object];

[invocation invoke];

The output in my console is:

2009-06-28 16:17:07.766 MyApplication[57869:20b] Object: <Cat: 0xd3f370>
2009-06-28 16:17:08.146 MyApplication[57869:20b] Color: <Color: 0xd3eae0>

Then, I get the following error:

*** -[Cat <null selector>]: unrecognized selector sent to instance 0xd3f370

Any clues? I'm using this similar method in other classes, but I can't figure out what I'm doing wrong in this instance. The selector 'color' obviously exists, but I don't know why it isn't being properly recognized.

+4  A: 

Try something like this:

NSLog(@"Object: %@", object);
NSLog(@"Color: %@", [object color]);

SEL sel = @selector(color);

NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:sel];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:sel];
[invocation setTarget:object];

[invocation invoke];

You were missing a call to NSInvocation's setSelector: method.

NSMethodSignature records type information for the arguments and return value of a method, but doesn't contain the selector itself. So if you want to use it with an NSInvocation you need to set the invocation's selector as well.

Mike Akers
That seems to be what was missing between this version and the code I was using in another class. I had actually noticed it at first, but assumed that since the NSMethodSignature was being instantiated using the selector, it would somehow be passed to the invocation. (If this works, you've got my vote. :) )
craig
Here is some code that will make this easier: http://www.a-coding.com/2010/10/making-nsinvocations.html
Aleph