Использование NSMethodSignature на iPhone (со свойствами Obj-C 2.0) - PullRequest
3 голосов
/ 29 июня 2009

Эй, ребята, я запускаю следующий код на моем телефоне, где «объект» - это Cat, который является подклассом Animal. Животное имеет свойство '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];

Вывод в моей консоли:

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>

Затем я получаю следующую ошибку:

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

Есть какие-нибудь подсказки? Я использую подобный метод в других классах, но я не могу понять, что я делаю неправильно в этом случае. Селектор «цвет», очевидно, существует, но я не знаю, почему он не распознается должным образом.

1 Ответ

9 голосов
/ 29 июня 2009

Попробуйте что-то вроде этого:

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];

Вы пропустили вызов NSInvocation setSelector: метода.

NSMethodSignature записывает информацию о типе для аргументов и возвращаемого значения метода, но не содержит сам селектор. Поэтому, если вы хотите использовать его с NSInvocation, вам также необходимо установить селектор вызова.

...