A principios de los 80, el software se desarrollaba usando programación estructurada.
Sin embargo, como los problemas seguían creciendo al pasar el tiempo, la programación estructurada se volvió compleja dado el desorden de algunos programadores para invocar instrucciones repetitivamente, llevando a código spaghetti y dificultando la reutilización de código.
Muchos vieron que la programación orientada a objetos sería la solución al problema.
Pero Smalltalk usaba una máquina virtual, lo cual requería mucha memoria para esa época, y era demasiado lento.
Objective-C fue creado principalmente por Brad Cox y Tom Love a inicios de los 80 en su compañía Stepstone.
Pronto tuvo una extensión para añadir la programación orientada a objetos a C la cual llamó «OOPC», Object-Oriented Programming in C. Love mientras tanto, fue contratado por Shlumberger Research en 1982 y tuvo la oportunidad de adquirir la primera copia de Smalltalk-80, lo que influyó en su estilo como programador.
Específicamente, estas necesitaban soportar objetos de manera flexible, venir con un conjunto de bibliotecas que fueran utilizables, y permitir que el código —y cualquier recurso necesitado por el código— pudiera ser empaquetado en un formato multiplataforma.
En 1986, Cox publicó la principal descripción de Objective-C en su forma original en el libro Object-Oriented Programming, An Evolutionary Approach.
El trabajo para extender GCC fue liderado por Steve Naroff, que se unió a NeXT proveniente de StepStone.
Esto llevó a que otras compañías desarrollaran esas librerías bajo licencias de código abierto.
El sistema GNU Objective-C, que ha sido usado desde 1993, es uno de los desarrollados por Kresten Krab Thorup cuando era un estudiante universitario en Dinamarca.
Tras adquirir NeXT en 1996, Apple empleó OpenStep en su nuevo sistema operativo, Mac OS X.
Una consecuencia de esto es que el mensaje del sistema que pasa no tiene chequeo de tipo: el objeto al cual es dirigido el mensaje —conocido como receptor— no está inherentemente garantizado a responder a un mensaje, y si no lo hace, simplemente lo ignora y retorna un puntero nulo.
Aun así, se requiere una implementación del método para efectuar la llamada.
Si myColor es de la clase Color, internamente, la instancia del método -changeColorToRed:green:blue: podría ser etiquetada como _i_Color_changeColorToRed_green_blue.
Esto se lleva a cabo primeramente alojando la memoria para el nuevo objeto y luego inicializándolo.
Este comportamiento es conocido como reenvío de mensajes o delegación (ver más abajo).
Si un objeto no reenvía un mensaje, lo responde o maneja un error entonces el sistema generará una excepción en tiempo de ejecución.
En las siguientes cuatro declaraciones se proveen tipos de información crecientemente específicos.
En la declaración anterior, foo puede ser una instancia de cualquier clase que satisfaga al protocolo NSCopying.
Objective-C permite el envío de un mensaje a un objeto que puede no responder.
Aquí hay un ejemplo de un programa que demuestra las bases del reenvío.
La ejecución del programa produce esta salida: & ./a.out El receptor dice hola!
Una propiedad puede ser declarada como "nonatomic" (no atómica), que elimina este seguro.
Es sobre todo usado como una alternativa a una categoría el añadir métodos a una clase sin declararlos en las cabeceras públicas, con la ventaja de que para las extensiones de clase el compilador comprueba que todos los métodos declarados privadamente son implementados realmente.
Cuando se usa el compilador de Apple LLVM 4.0 o superior, vectores, diccionarios y números (las clases NSAray, NSDictionary y NSNumber) pueden ser también creados usando sintaxis literal en lugar de métodos.
[15] La sintaxis literal usa el símbolo @ combinado con [], {} o () para crear las clases mencionadas anteriormente, respectivamente.
[15] Los subíndices se pueden usar para recuperar valores de índices (vectores) o llaves (diccionarios) y con objetos mutables también puede user para fijar objetos a índices o llaves.
[16] Ejemplos sin subíndices: Ejemplos con subíndices: Tras la compra de NeXT por parte de Apple, se hicieron varios intentos para asemejar más el lenguaje con respecto a otros lenguajes existentes.
La suite de compiladores Clang, parte del proyecto LLVM, implementa Objective-C así como otros lenguajes.