No Objetivo C, você tem o conceito de enviar mensagens para outros objetos e, bem, isso é muito semelhante à chamada de método em linguagens como C # e Java.
Mas quais são exatamente as diferenças sutis? Como devo pensar em mensagens ao pensar no meu código?
Nota: Apenas um pouco de experiência aqui, sou um desenvolvedor de C # / Java tentando entender alguns conceitos sobre o Objetivo C.
Respostas:
Uma mensagem é o nome de um seletor e os parâmetros para esse seletor.
Um seletor é um símbolo.
Um método é um pedaço de código em uma classe identificada por um seletor.
Em outras palavras,
[foo bar: baz]
diz "envie a mensagem chamada@selector(bar:)
com parâmetrobaz
para objetofoo
. Você pode enviar essa mensagem para muitos objetos diferentes.Por outro lado, o método
bar:
para umFoo
pode parecermas por um
FooTwo
pode parecer(Espero ter a sintaxe correta; já faz um tempo desde que toquei o Objective-C pela última vez.)
Quando você envia a mensagem, o kernel Objective-C despacha a mensagem para a
foo
qual decide se entende a mensagem. Ele decide isso com base em se pode encontrar um método identificado por esse seletor.Dois métodos com o mesmo nome e uma mensagem.
Também é possível que um objeto simplesmente encaminhe uma mensagem específica (ou conjunto de mensagens) para outro objeto para processamento. Nesse caso, você envia uma mensagem para esse objeto proxy, que não possui métodos para corresponder a essa mensagem , e o proxy encaminha a mensagem para seu objeto agrupado.
fonte
Do ponto de vista puramente teórico, não há nenhuma diferença entre os dois - houve várias provas formais mostrando que os dois são completamente equivalentes e que podem ser implementados inteiramente em termos do outro.
De um ponto de vista um pouco menos teórico, há uma diferença possível: em uma implementação típica, a tabela de funções virtuais é alocada estaticamente e o conteúdo de cada vtable é fixado em tempo de compilação. A pesquisa de mensagens, por outro lado, geralmente é feita com algum tipo de objeto parecido com um mapa, que é tipicamente dinâmico, o que significa que você pode modificá-lo em tempo de execução. Isso torna relativamente fácil adicionar uma nova resposta a uma mensagem em uma classe existente. Infelizmente, na maioria dos casos, isso permanece principalmente teórico. Primeiro, você está basicamente lidando com código auto-modificável, que a maioria das pessoas decidiu que era uma péssima ideia por muito tempotempo atrás. Segundo, para torná-lo muito significativo, é necessário que você consiga compilar o novo código na classe existente para responder à nova mensagem que você suporta. Sem isso, tudo o que você ganha é a capacidade de adicionar dinamicamente um novo nome para um método existente.
Como está implícito no final do parágrafo anterior, de um ponto de vista verdadeiramente prático, há muito pouca diferença entre os dois. Eles são simplesmente duas maneiras (muito pouco) diferentes de apoiar a ligação tardia. Embora a pesquisa baseada em mensagens seja geralmente um pouco mais lenta, seria bastante incomum que a diferença fosse realmente significativa. Para fins mais práticos, são apenas duas maneiras diferentes de realizar a mesma coisa.
fonte
No Objective-C, as mensagens são atrasadas. Ou seja, eles são resolvidos em tempo de execução. O C # suporta uma construção semelhante por meio da palavra-chave Dynamic, que também declara um objeto como atrasado.
fonte
Normalmente, as chamadas de método são resolvidas no tempo de compilação (a menos que você use reflexão em Java), enquanto as mensagens no Objetivo C são despachadas no tempo de execução.
fonte
struct
primeiro parâmetro. O bindung tardio é uma parte essencial do polimorfismo e, portanto, da POO.As mensagens são tratadas pelo kernel ou pelo próprio idioma (para o ObjC, por exemplo, existe um código de assembly muito pequeno).
No kernel do linux, por exemplo, as mensagens são feitas com chamadas / funções do sistema: você pode encontrá-las se pesquisar sobre a programação do sistema unix.
A principal diferença entre uma chamada de método e uma mensagem é esta:
uma chamada de método acontece apenas no seu código: no ASM, ela é traduzida por um push dos argumentos passados.
uma mensagem do kernel é principalmente algo enviado ao kernel que é rastreado e enviado de volta a certos processos. Posso confundi-los com pipes, mas seja o que for: saiba que já existem mecanismos que permitem executar vários programas ao mesmo tempo e permitir a comunicação ao mesmo tempo. Obviamente, não espere que isso funcione da mesma maneira no Windows ou em outro sistema operacional.
fonte