Eu sei como criar um SEL
em tempo de compilação usando, @selector(MyMethodName:)
mas o que eu quero fazer é criar um seletor dinamicamente de um NSString
. Isso é mesmo possível?
O que eu posso fazer:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
O que eu quero fazer: (pseudocódigo, obviamente não funciona)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Tenho pesquisado os documentos da API da Apple, mas não encontrei uma maneira que não dependa da @selector(myTarget:)
sintaxe de tempo de compilação .
objective-c
cocoa
dynamic
craigb
fonte
fonte
De acordo com a documentação do XCode, seu psuedocode basicamente acerta.
setWidthHeight = NSSelectorFromString(aBuffer);
Edit: Bummer, muito lento. : P
fonte
NSStringFromSelector(@"doWork")
converte-o de outra maneira (apenas fyi)Devo dizer que é um pouco mais complicado do que as respostas dos entrevistados anteriores podem sugerir ... se você realmente deseja criar um seletor ... não apenas "chamar aquele" que você "tem por aí" .. .
Você precisa criar um ponteiro de função que será chamado pelo seu "novo" método .. então, para um método como
[self theMethod:(id)methodArg];
, você escreveria ...e então você precisa gerar o
IMP
bloco dinamicamente, desta vez, passando, "self", oSEL
, e quaisquer argumentos ...e adicione-o à sua classe, junto com uma assinatura de método precisa para todo o sugador (neste caso
"v@:@"
, retorno void, chamador de objeto, argumento de objeto)Você pode ver alguns bons exemplos desse tipo de travessura em tempo de execução , em um dos meus repositórios, aqui.
fonte
Eu sei que isso foi respondido há muito tempo, mas ainda quero compartilhar. Isso também pode ser feito usando
sel_registerName
.O código de exemplo na pergunta pode ser reescrito assim:
fonte
NSSelectorFromString
mencionado por @ torsten-marek usasel_registerName
sob o capô. appledev : "NSSelectorFromString passa uma representação de caracteres codificados em UTF-8 de aSelectorName para sel_registerName e retorna o valor retornado por essa função"