Создайте SEL с объектом, переданным в него - PullRequest
0 голосов
/ 24 апреля 2011

Я знаю, как использовать:

[self method:object];

Но возможно ли получить объект SEL этого?

SEL method = @selector(method:object);

Не работает.

Спасибо:)

Ответы [ 2 ]

6 голосов
/ 24 апреля 2011

A SEL - это просто селектор - имя отправленного сообщения. Чтобы захватить конкретный экземпляр этого сообщения, его аргументы и возвращаемое значение в качестве объекта, необходимо использовать NSMethodSignature и NSInvocation . Пример, основанный на вашей гипотетической -method:object выше:

NSMethodSignature *sig = [SomeClass instanceMethodSignatureForSelector:@selector(method:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];

// Assume that someObject is an instance of SomeClass
[inv setTarget:someObject];

// Assume an "id object" declared elsewhere.
// Also note that self & _cmd are at indices 0 & 1, respectively
[inv setArgument:&object atIndex:2]

// Some time later...
[inv invoke];

Обратите внимание, что, поскольку NSInvocation является объектом, его не нужно вызывать немедленно. Он может быть сохранен для последующего использования, и, как правило, это так - есть гораздо более простые способы отправить сообщение, если кто-то хочет сделать это немедленно. Например, стандартный механизм отмены / повтора Cocoa основан на хранении и вызове NSInvocations.

0 голосов
/ 24 апреля 2011

@selector - это нечто, относящееся к другому методу или функции.

Возьмем для примера:

-(IBAction)timerStart {
timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
}

-(void)targetMethod:(id)sender {
[timer invalidate];
timer = nil;
}

Как видите, селектор (targetMethod :) работаетпризыв к действию после двух секунд запуска NSTimer.TargetMethod: является (void) функцией: (id) отправителя, и поэтому он запускается.

В вашем случае, я думаю, вы пытаетесь выполнить это

[self performSelector:@selector(methodName:)];
...