10

その情報が既にsetSelector.NSInvocationinvocationWithMethodSignature

オブジェクトを作成するNSInvocationには、次のようにします。

SEL someSelector;
NSMethodSignature *signature;
NSInvocation *invocation;

someSelector = @selector(sayHelloWithString:);

//Here we use the selector to create the signature
signature = [SomeObject instanceMethodSignatureForSelector:someSelector];
invocation = [NSInvocation invocationWithMethodSignature:signature];

//Here, we again set the same selector
[invocation setSelector:someSelector];
[invocation setTarget:someObjectInstance];
[invocation setArgument:@"Loving C" atIndex:2];

セレクターを に渡したことに注意して[SomeObject instanceMethodSignatureForSelector: someSelector];ください[invocation setSelector:someSelector];

足りないものはありますか?

4

3 に答える 3

8

署名はセレクターではありません。セレクターはメッセージの名前です。シグネチャは、パラメーターと戻り値を定義します。同じ署名を持つ多くのセレクターを持つことができ、その逆も可能です。を見るとNSMethodSignature、メソッドがないことに気付くでしょう-selector。シグニチャーは特定のセレクターを保持しません。

次のことを考慮してください

- (void)setLocation:(CGFloat)aLocation;
- (void)setLocation:(MyLocation*)aLocation;

それらは同じ selector を持ちますが、@selector(setLocation:)署名は異なります。

- (void)setX:(CGFloat)x;
- (void)setY:(CGFloat)y;

これらのシグネチャは同じですが、セレクターが異なります。

これを理解するには、ObjC プログラミング言語のセレクターが参考になるかもしれません。

于 2011-04-07T19:13:13.373 に答える
3

A method signature only defines the return type, and the number and type of arguments. It doesn't include anything about the selector name. For example, all of these methods have the same signature, despite having different selectors:

-(void) foo:(NSString*)fooString;
-(void) bar:(NSString*)barString;
-(void) baz:(NSString*)bazString;
于 2011-04-07T19:14:11.717 に答える
0

これは一種の副次的な答えですが、次のことができるという事実は、メソッドシグネチャとセレクターの分離をよりよく理解するのに役立ちました。

このコードはViewController内にあります

NSMethodSignature *sig = nil;
sig = [[self class] instanceMethodSignatureForSelector:@selector(viewDidAppear:)];
NSInvocation *myInvocation = nil;
myInvocation = [NSInvocation invocationWithMethodSignature:sig];

[myInvocation setTarget:_somePopoverController];
[myInvocation setSelector:@selector(dismissPopoverAnimated:)];
BOOL animate = YES;
[myInvocation setArgument:&animate atIndex:2];
[myInvocation invoke];

UIViewControllerのviewDidAppear:とUIPopoverControllerのdismissPopoverAnimated:はどちらもBOOL引数を取り、voidを返すため、1つのセレクターを使用してメソッドシグネチャを作成できますが、呼び出しを別のセレクターに送信します。

于 2011-05-26T10:39:22.377 に答える