Ao começar a estudar iOS e ver código Objective-C pela primeira vez, é fácil ficar confuso.
Ele é cheio de colchetes [ ]. Parece uma chamada de função, mas tem uma aparência muito diferente da de outras linguagens.
É natural ficar com a dúvida: “Por que fizeram isso desse jeito?”.
Indo direto ao ponto, os colchetes do Objective-C não “chamam” uma função; eles são a sintaxe para “enviar uma mensagem” a um objeto. Quando você entende essa ideia, os colchetes deixam de parecer estranhos.
Hoje vamos entender com calma, desde a origem, por que esses colchetes têm esse formato. 😊
Vamos começar pelo resumo dos pontos principais
Primeiro, veja o que você vai aprender neste artigo.
- Os colchetes do Objective-C significam “enviar uma mensagem a um objeto”
- Essa sintaxe foi herdada da linguagem Smalltalk
- Entendendo apenas a estrutura
[객체 메서드], você consegue ler a maior parte dos casos - Internamente, ela é convertida em uma função chamada
objc_msgSendpara ser executada
Entendendo esses quatro pontos, você já terá atingido o objetivo de hoje.
Afinal, o que é a sintaxe de envio de mensagens do Objective-C?
Em outras linguagens, normalmente escrevemos uma chamada de método assim.
object.method()
No Objective-C, porém, escrevemos assim.
// dog Enviar a mensagem bark ao objeto
[dog bark];
// count Enviar o valor junto como argumento
[dog barkTimes:3];
A aparência é diferente, mas a estrutura é simples.
[받는객체 보낼메시지]
Abra os colchetes, coloque à esquerda o objeto que recebe a mensagem e, à direita, escreva a mensagem a ser enviada.
Assim, [dog bark] significa “dog, faça bark”.
Para mim, pensar nisso como “conversar” com o objeto, e não como uma “chamada de função”, torna tudo muito mais fácil.
Quando há vários argumentos, a expressão cresce desta forma.
// O nome da mensagem é dividido em setName:age: duas partes
[person setName:@"Cheolsu" age:20];
Pense que cada dois-pontos (:) recebe um valor.
Por que os colchetes têm esse formato?
Os colchetes do Objective-C são um vestígio da adaptação da filosofia de “envio de mensagens” do Smalltalk sobre a linguagem C.
A história remonta ao início da década de 1980.
Objective-C foi criado por Brad Cox e Tom Love.
Eles queriam continuar usando a popular linguagem C da época, mas acrescentar a ela conceitos de programação orientada a objetos.
O modelo dessa programação orientada a objetos era o Smalltalk.
A filosofia central do Smalltalk era: “tudo é um objeto, e os objetos trocam mensagens entre si”.
O desafio era inserir o conceito de mensagens sem quebrar a sintaxe do C.
Por isso, escolheram os colchetes, pouco usados na sintaxe do C, e definiram seu interior como o espaço para enviar mensagens.
Assim, eles podiam ser diferenciados sem conflitos mesmo quando misturados ao código C existente.
Mais tarde, a linguagem foi adotada pela NeXT e, quando a Apple comprou a NeXT em 1996, tornou-se a base do desenvolvimento para Mac e iPhone.
O framework Cocoa que conhecemos também surgiu daí.
Um par de colchetes estranhos carrega uma história longa.
Qual é a diferença para a sintaxe com ponto (.)?
No código Objective-C atual, a sintaxe com ponto (.) também aparece com frequência.
Por exemplo, dog.name.
É fácil confundir as duas, então organizei a relação entre elas em uma tabela.
| Categoria | Sintaxe com colchetes | Sintaxe com ponto (.) |
|---|---|---|
| Forma | [dog name] |
dog.name |
| Significado | Envio de mensagens | Acesso a propriedades |
| Período de surgimento | Desde o início | A partir do Objective-C 2.0 (2007) |
| Funcionamento interno | Execução de métodos | Conversão efetiva em método |
O interessante é que a sintaxe com ponto também acaba sendo convertida internamente em uma mensagem com colchetes.
Ou seja, quando executado, dog.name faz essencialmente o mesmo que [dog name].
A sintaxe com ponto é apenas uma camada externa criada para facilitar a leitura.
Por isso, recomendo que iniciantes entendam primeiro que a essência está nos colchetes.
O que realmente acontece dentro dos colchetes?
Vamos um pouco mais fundo.
Quando você escreve [dog bark], o compilador converte isso em uma chamada à função objc_msgSend.
// O código que escrevemos
[dog bark];
// Internamente, isso é convertido mais ou menos assim
objc_msgSend(dog, @selector(bark));
Na primeira posição entra o objeto que recebe a mensagem; na segunda, o nome do método a ser executado (selector).
Essa abordagem é flexível porque permite decidir em tempo de execução qual método será executado.
Por isso, o Objective-C tinha recursos dinâmicos poderosos, como alterar ou adicionar métodos durante a execução.
Por trás da aparência dos colchetes, havia uma estrutura flexível como essa.
Vamos resumir em perguntas e respostas
P. Preciso decorar os colchetes?
Mais do que decorar, basta entender a estrutura [받는객체 보낼메시지] para conseguir ler naturalmente.
P. Hoje uso Swift. Ainda preciso saber disso?
Bibliotecas antigas e códigos de exemplo ainda estão escritos em Objective-C, então saber lê-los ajuda bastante.
P. E se houver colchetes dentro de outros colchetes?
É uma estrutura em que o lado de fora recebe novamente o resultado do lado de dentro. Leia de dentro para fora e tudo se resolve.
Mesmo que os colchetes pareçam apenas uma regra estranha, eles ficam muito mais familiares quando você passa a pensar neles como uma “sintaxe para conversar com objetos”.
Quanto mais estranha a sintaxe, mais tempo ela tende a permanecer na memória quando você conhece sua origem.
Espero que este artigo ajude você a se aproximar um pouco mais do Objective-C. Torcendo por você! 🙌

