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.