C objetivo | |
Fecha de la primera versión | 1983 |
---|---|
Paradigma | orientado a objetos , reflectante |
Autor | Brad Cox y Tom Love |
Última versión | 2.0 |
Mecanografía | dinámico , estático , débil |
Influenciado por | C , Smalltalk |
Influenciado | TOM , Java , Swift |
Implementaciones | OpenStep , Cocoa , GNUstep |
Sistema de explotación | UNIX, macOS |
Licencia | Libre |
Sitio web | developer.apple.com/library/mac/navigation |
Extensión de archivo | h, m, mm y C |
Objective-C es un lenguaje de programación orientado a objetos reflexivo . Esta es una extensión de ANSI C , como C ++ , pero se diferencia de él por su entrega dinámica de mensajes, su escritura débil o fuerte, su escritura dinámica y carga dinámica. A diferencia de C ++, no permite la herencia múltiple, pero hay formas de combinar las ventajas de C ++ y Objective-C.
Hoy en día, se utiliza principalmente en el funcionamiento de los sistemas Apple : macOS y su iOS derivado basado en la biblioteca de clases Cocoa, pero también hay una biblioteca de clases gratuita GNUstep bajo GNU / Linux . Cocoa y GNUstep son los sucesores de la API OpenStep , utilizada en los sistemas operativos NeXTSTEP (originalmente macOS) y su contraparte gratuita OPENSTEP .
El final de la década de 1970 estuvo marcado por la creciente y rápida popularidad del lenguaje C inventado a principios de la década por Dennis Ritchie en AT&T Bell Laboratories . Esta popularidad está impulsada por una popularidad aún mayor, la del sistema operativo UNIX escrito completamente en C. A principios de los años setenta y ochenta , la práctica actual de la ingeniería de software se basa en la programación estructurada . La implementación de la programación estructurada se utiliza con el propósito de dividir programas grandes en partes más pequeñas, de menor complejidad y por lo tanto más fáciles de programar. Sin embargo, a medida que la resolución de problemas se vuelve más grande y más complicada, la programación estructurada se vuelve menos útil a medida que se tienen que escribir más y más procedimientos, lo que conduce a estructuras de control complejas y a una baja reutilización del código. En ese momento, muchos vieron la orientación a objetos como una posible solución a este problema.
Luego, varias personas crean extensiones para C para agregar el formato orientado a objetos. Este es el caso de Bjarne Stroustrup que desarrolló C ++ en 1979 en los mismos laboratorios en los que nació el C de Dennis Ritchie. El nacimiento de Objective-C ocurre en el mismo contexto. Brad Cox lo desarrolló a principios de la década de 1980. El lenguaje se presenta como una superposición de C para permitir la creación y manipulación de objetos, retomando ciertos conceptos del lenguaje Smalltalk-80 .
El código compilado de Objective-C se ejecuta en un entorno de ejecución ( tiempo de ejecución ) Light escrito en C, lo que añade poco al tamaño de la aplicación.
El primer sistema operativo en utilizar Objective-C fue NeXTSTEP (luego rebautizado como OPENSTEP ), de la empresa NeXT , fundada por Steve Jobs .
Objective-C se usa ampliamente en Macintosh , en particular para las API Cocoa de Mac OS X y, más recientemente, para el desarrollo de aplicaciones de iPhone , el teléfono inteligente de Apple.
También hay una implementación gratuita del marco OpenStep , llamado GNUstep , que es multiplataforma y funciona en particular bajo GNU / Linux , Microsoft Windows y la mayoría de UNIX .
En Objective-C, todo es un objeto al igual que en Smalltalk del que está fuertemente inspirado. Por tanto, es un lenguaje fuertemente orientado a objetos. La herencia simple induce un árbol de herencia con raíz: la clase NSObject, en el caso de Cocoa / NeXTSTEP, u Object en el caso de GNUstep. De él se derivarán todas las clases. Por ejemplo, un objeto de la clase NSString, o NSArray, se deriva de la clase NSObject (indirectamente). NSMutableArray se deriva de la clase NSArray, que es por tanto su superclase. Según algunos de sus usuarios, aquí es donde aparece el poder de Objective-C: a diferencia de C ++ u otros lenguajes que no lo incluyen, la escritura débil facilita la manipulación de datos.
De hecho, en lugar de tener que manejar muchos tipos, solo hay unos pocos, por ejemplo en el caso de Cocoa:
Además, todas las variables de instancia de clase están protegidas de forma predeterminada y los métodos de clase son públicos. Por tanto, permite a los programadores tener una programación más rigurosa, a la vez que más rápidos y respetando los conceptos de POO.
Otro aspecto es el del modelo de diseño KVC (Key-Value Coding), también inspirado en Smalltalk , que define el acceso a una variable por su nombre. Por ejemplo, en el caso de una clase Person, con una variable de instancia Firstname, de tipo NSString:
@interface Personne : NSObject { // variables d'instance NSString *prenom; } // methodes @property (copy) NSString *prenom; @endObjective-C permite la creación rápida de un objeto NSString usando "@", de la misma manera que C con cadenas "". NSStrings están codificados en Unicode , es decir, a diferencia de C, los caracteres no se limitan a códigos ASCII. Por lo tanto, podemos establecer el valor de la variable apellido de una instancia de Persona como esta:
// On crée un pointeur vers un objet de la classe Personne, qu'on a d'abord alloué dans l'espace mémoire, et initialisé. Personne *exemple = [[Personne alloc] init]; //On envoie un message au pointeur exemple qui va le rediriger vers l'objet vers lequel il pointe, pour fixer la valeur de la clef surname. [exemple setValue:@"Paul" forKey:@"prenom"];En Objective-C, cualquier llamada a método de una clase es un mensaje que pasa. Para llamar un mensaje sobre un objeto, coloque el objeto entre corchetes y luego el mensaje. Puede encadenar llamadas muy fácilmente. Entonces, en el ejemplo, el método devuelve un objeto y en este objeto llamamos al método2 .
// passage de message [objet methode:argument]; // chaînage de message [[objet methode:argument] methode2:argument2];
La sintaxis de los métodos, un poco confusa a primera vista, ha sido diseñada para parecerse más al lenguaje humano. Cada argumento está separado por ":" así como por un comentario.
Cada instancia de objeto tiene un puntero isa, que es un puntero a un objeto de metaclase que describe los métodos accesibles por el objeto. Una clase que tiene un padre, la metaclase representa un árbol con toda la jerarquía de clases actualmente en la memoria. Entonces, cuando intentamos pasar un mensaje, el entorno Objective-C recupera el puntero isa del objeto, luego atraviesa el árbol de la metaclase para obtener el puntero del método llamado. Este mecanismo es obviamente caro, pero un dispositivo de almacenamiento en caché durante la primera llamada lo hace muy eficiente.
Objective-C ++ es un front-end para GCC , que compila una combinación de código C ++ y Objective-C. Objective-C ++, además de extensiones en C ++ que el lenguaje Objective-C agrega C .