ページ

2009年7月16日木曜日

NSInvocation を使う #2

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

昨日の続き。

なんのことはない +[NSObject instanceMethodSignatureForSelector:] を使えばシグネチャの問題は解決した。

NSObject Class Reference - instanceMethodSignatureForSelector:


昨日のコード

NSMethodSignature* signature = [self methodSignatureForSelector:selector];


新コード
NSMethodSignature* signature = [[self.target class] instanceMethodSignatureForSelector:selector];



実行時にクラス情報を得て、それに対して instanceMethodSignatureForSelector: を投げてやればいい。

最終的なコードはこんなかんじ。

SEL selector = @selector(hotkeyShouldChange:);
NSMethodSignature* signature = [[self.target class] instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
BOOL result;
[invocation setSelector:selector];
[invocation setTarget:self.target];
[invocation setArgument:&_hotkey atIndex:2];
[invocation invoke];
[invocation getReturnValue:&result];

if (result) {
: