Objective-C es C más Smalltalk, literalmente: la sintaxis de mensajes de uno pegada sobre el otro, sin mezclarlos. Durante treinta años fue el lenguaje del Mac y del iPhone, y aunque Swift lo ha sustituido para lo nuevo, hay demasiado código y demasiadas APIs escritas en él como para que desaparezca.
🎯 Por qué está en este programa
Objective-C es un primo de la familia C / llaves (Atlas), cuyo representante en el núcleo es C.
Aporta al programa algo que ningún otro lenguaje de la lista enseña con tanta claridad: el despacho dinámico de mensajes en un lenguaje compilado (clases 111 y 112). En Objective-C cualquier objeto puede recibir cualquier mensaje, y eso se decide en ejecución — el modelo de Smalltalk, sobre memoria y punteros de C.
| Año | 1984; Objective-C 2.0 en 2006; ARC en 2011 |
| Autoría | Brad Cox y Tom Love, Stepstone; adoptado por NeXT y luego Apple |
| Familia | C / llaves — con el modelo de objetos de Smalltalk |
| Paradigma | Imperativo + orientado a objetos por paso de mensajes |
| Tipado | Estático para C, dinámico para los objetos; id es "cualquier objeto" |
| Memoria | Conteo de referencias; manual hasta 2011, automático (ARC) desde entonces |
| Ejecución | Compilado a nativo (Clang), con un tiempo de ejecución que resuelve los mensajes |
| Estado | 🟡 Mantenimiento: no se elige para lo nuevo, y hay muchísimo escrito |
A principios de los ochenta, Brad Cox quería la reutilización de componentes que Smalltalk prometía, pero con el rendimiento y la portabilidad de C. Su solución fue no mezclar los dos lenguajes: añadir a C una sintaxis nueva y separada —los corchetes— para el envío de mensajes, dejando C intacto por debajo.
Steve Jobs lo eligió para NeXTSTEP en 1988, y ahí se construyeron las bibliotecas que hoy siguen
vivas: las clases con prefijo NS —de NeXTSTEP— que cualquiera que haya tocado macOS o iOS
reconoce.
Cuando Apple compró NeXT en 1996, NeXTSTEP se convirtió en Mac OS X, y Objective-C pasó a ser el lenguaje de Apple. Con el iPhone SDK (2008) se volvió, de golpe, uno de los lenguajes más demandados del mundo.
Objective-C 2.0 (2006) trajo propiedades, enumeración rápida y recolección de basura —después
descartada—; y ARC (2011) automatizó el conteo de referencias, que hasta entonces se escribía a
mano con retain y release.
En 2014 Apple presentó Swift y Objective-C entró en mantenimiento. No ha desaparecido: buena parte de los marcos de Apple sigue siendo Objective-C por dentro, y la interoperabilidad entre los dos es diaria.
Esta es la idea que hay que llevarse:
[objeto hacerAlgoCon:valor y:otro]; // NO es objeto.hacerAlgo(valor, otro)
Enviar un mensaje no es llamar a un método: es pedirle al tiempo de ejecución que busque qué método corresponde, en ejecución, por el nombre del selector.
Y de ahí salen tres consecuencias que la clase 111 desarrolla:
nil y no pasa nada — devuelve cero y sigue. Es una decisión
deliberada que elimina montañas de comprobaciones y que a la vez esconde errores.respondsToSelector:), y
añadir métodos a una clase existente con las categorías — lo que en Ruby se llama clase
abierta y en C# métodos de extensión.forwardInvocation:, el equivalente de doesNotUnderstand: de
Smalltalk (clase 158): un objeto puede interceptar los mensajes que no entiende y
reenviarlos. Es la base de los objetos proxy y de la simulación en pruebas, sin biblioteca.Y el precio es el de siempre en este curso (clase 164): esa flexibilidad impide comprobar en compilación que el mensaje existe. Enviar un selector mal escrito compila con un aviso y falla al ejecutarse. Swift eligió lo contrario, y esa es la diferencia principal entre los dos.
retain/release, con lo que la gestión manual desapareció
— sin recolector y sin pausas (clase 131).@[], @{}, array[0]), que hicieron el lenguaje mucho menos
verboso.nullable, nonnull) y genéricos ligeros, añadidos sobre todo
para que Swift pueda importar las APIs con tipos precisos — la interoperabilidad guiando el
diseño.@import) en lugar de #import textual, con compilación mucho más rápida
(clase 149).clang -framework Foundation main.m -o venta # macOS
gcc `gnustep-config --objc-flags` main.m -o venta # GNUstep, en Linux
Es la versión que aparece en el
primos.md de la clase 041.
#import <Foundation/Foundation.h>
int main(void) {
@autoreleasepool {
double precio, cantidad, descuento;
scanf("%lf %lf %lf", &precio, &cantidad, &descuento);
double total = precio * cantidad * (1 - descuento);
printf("Total: %.2f\n", total);
}
return 0;
}
Lo que hay que ver.
scanf, printf, double, &precio: el programa de la ficha de C
compila aquí sin tocar nada. Esa es la tesis del lenguaje — la capa de objetos se añade, no
sustituye.@autoreleasepool es lo único que no es C, y marca el ámbito donde se liberan los objetos
aplazados. Con ARC ya casi no hace falta, y aparece por costumbre.NSString y NSScanner, y ahí aparecería [cadena doubleValue] — el paso de
mensajes.⏮️ Volver al Atlas · 🗂️ Todas las fichas · 🔗 Relacionadas: C · Smalltalk · Swift · C++