Pergunta

Eu quero configurar uma tabela de expedição Método e eu estou querendo saber se é possível criar ponteiro para um método em Objective-C (como ponteiro para função em C). Eu tentei usar algumas funções de tempo de execução Objective-C para mudar dinamicamente métodos, mas o problema é que irá afectar todas as instâncias.

Como eu sou muito novo para Objective-C, um exemplo ilustrado seria muito apreciada.

Foi útil?

Solução

métodos Objectivo-C são chamados selectors, e são representados pelo tipo de dados SEL. Se seus herda objeto de NSObject, você pode dizer que para realizar um seletor (ou seja, chamar um método) como assim:

SEL selector = @selector(doSomething:);
[obj performSelector:selector withObject:argument];

Isso pressupõe que você tem um método definido como:

-(void)doSomething:(MyObject*)arg;

Seletores são atribuídos a tipos de dados SEL através da palavra-chave @selector, que leva o nome do método que você gostaria de manter. O nome do método é o nome do método despojado de todos os argumentos. Por exemplo:

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params

seria referenciado como @selector(doSomething:withParams:).

Outras dicas

Sim! Em Objective-C, ponteiros de função são chamados seletores. Se você tiver um método definido como este:

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2
{
}

O seletor é declarada como este:

@selector(myFunctionWithObject:otherObject:)

Para executar um seletor em um objeto, você pode usar:

[object performSelector:@selector(myFunction)];

ou

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o];

O tipo de dados seletor é particularmente útil para fios e temporizadores, onde você pode despachar um fio e fornecer-lhe um seletor para a mensagem que você gostaria que invocar. Se você precisa criar uma matriz de selectores (ou uma tabela de expedição), ou se você precisa invocar seletores com vários parâmetros, você pode usar a classe NSInvocation. Ele fornece um invólucro para um seletor e permite que você especifique argumentos reais.

Você deve ter em mente que Objective-C já é baseado em uma tabela de métodos expedição totalmente dinâmico. Parece manter ponteiros de função usando seletores irá funcionar bem para você, se você só precisa de uma referência a uma função, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top