📱 Objective-C — 1984

⬅️ Atlas · 🗂️ Todas las fichas · 📚 Índice de clases

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

📜 Historia

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.

🏭 Dónde vive hoy

🧠 Lo que enseña: el mensaje no es una llamada

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:

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.

🔄 Lo que se ha modernizado

⚙️ Cómo se ejecuta hoy

clang -framework Foundation main.m -o venta        # macOS
gcc `gnustep-config --objc-flags` main.m -o venta   # GNUstep, en Linux

🧪 El programa de la clase 041 en Objective-C

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.

📚 Fuentes y bibliografía


⏮️ Volver al Atlas · 🗂️ Todas las fichas · 🔗 Relacionadas: C · Smalltalk · Swift · C++