Craig Otis
Craig Otis

Reputation: 32084

Using NSMethodSignature on iPhone (with Obj-C 2.0 properties)

I am 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.

Upvotes: 3

Views: 5769

Answers (1)

Mike Akers
Mike Akers

Reputation: 12247

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.selector = sel;
invocation.target = 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.

Upvotes: 9

Related Questions