Es fácil desconcertarse al ver código Objective-C por primera vez cuando empiezas a estudiar iOS.
Está lleno de corchetes [ ]. Parece una llamada a una función, pero su aspecto es muy distinto al de otros lenguajes.
Es normal quedarse con la duda: «¿Por qué lo hicieron así?».
En resumen, los corchetes de Objective-C no sirven para «llamar» a una función, sino para «enviar un mensaje» a un objeto. Cuando entiendes esta idea, esos corchetes que parecían extraños empiezan a tener sentido.
Hoy veremos con calma por qué tienen este aspecto y cuál es su origen. 😊
Empecemos por el resumen clave
Primero, aquí tienes un resumen de lo que aprenderás en este artículo.
- Los corchetes de Objective-C significan «enviar un mensaje a un objeto»
- Esta sintaxis procede del lenguaje Smalltalk
- Con entender una sola estructura
[객체 메서드], podrás leer la mayoría de los casos - Internamente, se transforma y ejecuta como una función llamada
objc_msgSend
Con entender estas cuatro ideas, habrás alcanzado el objetivo de hoy.
¿Qué es exactamente la sintaxis de envío de mensajes de Objective-C?
En la mayoría de los lenguajes, los métodos se invocan así.
object.method()
En Objective-C, en cambio, se escribe así.
// dog enviar el mensaje « bark » al objeto
[dog bark];
// count enviar también el valor como argumento
[dog barkTimes:3];
Aunque su aspecto resulta extraño, la estructura es sencilla.
[받는객체 보낼메시지]
Abres el corchete, colocas a la izquierda el objeto que recibirá el mensaje y escribes a la derecha el mensaje que enviarás.
Por eso, [dog bark] significa «perro, ladra».
A mí me resulta mucho más fácil entenderlo como «hablarle» a un objeto que como una «llamada a una función».
Cuando hay varios argumentos, la sintaxis se amplía de esta manera.
// el nombre del mensaje se setName:age: divide en dos partes
[person setName:@"Cheolsu" age:20];
Puedes pensar que cada dos puntos (:) va asociado a un valor.
¿Por qué tienen este aspecto los corchetes?
Los corchetes de Objective-C son el rastro de haber incorporado la filosofía del «envío de mensajes» de Smalltalk sobre el lenguaje C.
La historia se remonta a principios de la década de 1980.
Dos personas, Brad Cox y Tom Love, crearon Objective-C.
Querían seguir usando el popular lenguaje C de la época, pero añadirle conceptos de la programación orientada a objetos.
El modelo de referencia para esa programación orientada a objetos fue Smalltalk.
La filosofía central de Smalltalk era que «todo es un objeto y los objetos intercambian mensajes».
El reto consistía en incorporar el concepto de mensajes sin romper la sintaxis de C.
Por eso tomaron los corchetes, que apenas se usaban en la sintaxis de C, y los reservaron como espacio para enviar mensajes.
Así podían distinguirse sin conflictos incluso al mezclarlos con código C existente.
Más adelante, NeXT adoptó este lenguaje, y cuando Apple adquirió NeXT en 1996, se convirtió en una de las bases del desarrollo para Mac y iPhone.
El framework Cocoa que conocemos también surgió de ahí.
En un par de corchetes aparentemente extraños se esconde toda esta historia.
¿En qué se diferencia de la sintaxis con punto (.)?
En el código Objective-C actual también es habitual ver la sintaxis con punto (.).
Por ejemplo, dog.name.
Por eso es fácil confundirse, así que he resumido la relación entre ambas en esta tabla.
| Distinción | Sintaxis con corchetes | Sintaxis con punto (.) |
|---|---|---|
| Forma | [dog name] |
dog.name |
| Significado | Envío de mensajes | Acceso a propiedades |
| Momento de aparición | Desde los comienzos | Desde Objective-C 2.0 (2007) |
| Funcionamiento interno | Ejecución de métodos | Se transforma esencialmente en un método |
Lo interesante es que la sintaxis con punto también se transforma internamente en un mensaje con corchetes.
Es decir, dog.name hace lo mismo que [dog name] al ejecutarse.
La sintaxis con punto es solo una capa externa diseñada para facilitar la lectura.
Por eso recomiendo a quienes empiezan que entiendan primero que la esencia está en los corchetes.
¿Qué ocurre realmente dentro de los corchetes?
Veámoslo con un poco más de profundidad.
Cuando escribes [dog bark], el compilador lo transforma en una llamada a la función objc_msgSend.
// el código que escribimos
[dog bark];
// internamente se transforma aproximadamente así
objc_msgSend(dog, @selector(bark));
En la primera posición va el objeto que recibe el mensaje y, en la segunda, el nombre del método que se ejecutará (el selector).
Este mecanismo es flexible porque decide qué método ejecutar en tiempo de ejecución.
Gracias a ello, Objective-C ofrecía potentes capacidades dinámicas para cambiar o añadir métodos durante la ejecución.
Detrás de la apariencia de los corchetes se ocultaba una estructura tan flexible.
Repasémoslo con preguntas y respuestas
P. ¿Tengo que memorizar los corchetes?
Más que memorizarlos, basta con familiarizarse con la estructura [받는객체 보낼메시지] para leerla de forma natural.
P. Ahora uso Swift, ¿debería conocerla?
Muchas bibliotecas antiguas y ejemplos de código siguen escritos en Objective-C, así que saber leerlo resulta de gran ayuda.
P. ¿Y si hay otro corchete dentro de los corchetes?
Es una estructura en la que el exterior vuelve a recibir el resultado del interior. Si lo lees de dentro hacia fuera, se entiende.
Los corchetes pueden parecer una regla extraña, pero resultan mucho más cercanos cuando cambias la perspectiva y los ves como una «sintaxis para hablarle a un objeto».
Cuanto más extraña es una sintaxis, más fácil resulta recordarla durante mucho tiempo cuando conoces sus raíces.
Espero que este artículo te ayude a familiarizarte un poco más con Objective-C. ¡Mucho ánimo! 🙌

