Cacao

Cocoa (del  inglés  -  " cocoa ") es una API orientada a objetos para el sistema operativo macOS de Apple . Es una de las cinco API principales disponibles en Mac OS X: Cocoa, Carbon , Toolbox (para ejecutar aplicaciones anteriores de Mac OS 9 ), POSIX y Java . Los lenguajes como Perl , Python y Ruby no se consideran lenguajes principales, ya que todavía no hay muchas aplicaciones serias para Mac OS X escritas en ellos.

Las aplicaciones que usan Cocoa generalmente se desarrollan usando el entorno de desarrollo Xcode de Apple (anteriormente llamado Project Builder ) e Interface Builder usando lenguajes de programación : C , Objective-C y Swift . Sin embargo, el entorno Cocoa también está disponible cuando se desarrolla en otros lenguajes como Ruby , Python y Perl utilizando las bibliotecas de enlaces ( MacRuby , PyObjC y CamelBones respectivamente). También es posible escribir programas Cocoa de Objective-C en un editor de texto normal y compilarlos manualmente usando GCC o GNUstep makescripts .

Desde el punto de vista del usuario final , las aplicaciones Cocoa son aplicaciones escritas utilizando el entorno de programación Cocoa. Estas aplicaciones suelen tener un aspecto y una sensación distintivos, ya que este entorno facilita mucho la compatibilidad con las Directrices de interfaz humana de Apple.

Historia del Cacao

Cocoa es una continuación de los entornos de software NeXTSTEP y OPENSTEP que desarrolló NeXT a fines de la década de 1980. Apple adquirió NeXT en diciembre de 1996 y comenzó a trabajar en el sistema operativo Rhapsody , que sería el sucesor directo de OPENSTEP. Se suponía que iba a incluir la llamada "Blue Box" ( Caja Azul ), para proporcionar emulación de las aplicaciones de Mac OS . La base de la biblioteca y el soporte para el formato de archivo ejecutable OPENSTEP se denominó "Caja amarilla" ( Yellow Box ). Rhapsody evolucionó a Mac OS X y Yellow Box se convirtió en Cocoa. Como resultado, los nombres de las clases de Cocoa comienzan con las letras NS (para NeXTStep [1] ): NSString, NSArray, etc.

La mayor parte del código escrito para OPENSTEP se ha incluido en Cocoa y Mac OS X, pero existen algunas diferencias. Por ejemplo, NeXTSTEP y OPENSTEP utilizaron la tecnología Display PostScript para mostrar texto y gráficos en la pantalla , mientras que Cocoa utiliza el sistema Quartz de Apple (que utiliza el mismo modelo de imagen que PDF ). Además, Cocoa tiene soporte para Internet, como la clase NSURL y las clases WebKit para trabajar con HTML , mientras que OPENSTEP solo tenía soporte limitado para trabajar con conexiones de red usando la clase NSFileHandle y los sockets de Berkeley.

Anteriormente, la marca "Cocoa" se usaba como nombre de una aplicación que permite a los niños crear proyectos multimedia. Originalmente conocida como KidSim , esta aplicación ahora es propiedad de un tercero y tiene la marca Stagecast Creator . La terminación del soporte para el programa se llevó a cabo en línea con la racionalización que siguió al regreso de Steve Jobs a Apple. El antiguo nombre se reutilizó para evitar una nueva demora en el registro de la marca y Stagecast acordó desarrollar el antiguo Cocoa con el nuevo nombre.

Gestión de memoria

Una de las características del entorno Cocoa es un mecanismo para administrar la memoria asignada dinámicamente. La clase NSObject, de la que se derivan la mayoría de las clases Cocoa, tanto estándar como personalizadas, implementa un mecanismo de recuento de referencias para la gestión de la memoria . Los objetos derivados de NSObject responden a los mensajes retainy releasealmacenan el recuento de referencias, que se puede encontrar enviando un mensaje al objeto retainCount. Un objeto recién creado con los métodos alloco copytiene un recuento de referencias de uno. Enviar un mensaje a un objeto retainaumenta el número de referencias y enviar un mensaje release lo disminuye. Cuando el recuento de referencias llega a cero, el objeto se elimina y la memoria que ocupaba se libera (desasignar memoria para objetos Objective-C  es lo mismo que llamar al destructor para objetos C++. El método deallochace lo mismo que el destructor en C++. Su llamada no garantizada). Este enfoque de conteo de referencias es muy similar al COM de Microsoft con su interfaz IUnknown . IUnknown proporciona una funcionalidad similar a retainla releasede AddRefy Release.

Además del recuento de referencias, los programadores pueden aprovechar los grupos de liberación automática. Al enviar un mensaje a autoreleaseun objeto, se registra el objeto en el grupo de publicación automática más cercano del subproceso actual para una publicación futura. Cuando se libera el grupo de liberación automática, envía un mensaje releasepor cada mensaje enviado anteriormente autorelease. Los grupos desasignados automáticamente generalmente se crean y desasignan al principio y al final de un bucle de mensajes, lo que garantiza que la ejecución del programa salga del bloque en el que los objetos se registraron para la desasignación automática. Esto significa que la aplicación se ejecuta de forma predecible y libera memoria de forma transparente para el usuario, mientras que, en la mayoría de los casos, al utilizar la recolección automática de elementos no utilizados , el programa deja de responder repentinamente a las acciones del usuario cuando se inicia.

La recolección automática de basura en Cocoa se admite desde Objective-C 2.0 cuando se desarrolló en Xcode 3.0, incluido con Mac OS X 10.5 Leopard. El programador ahora tiene la opción de elegir entre manejo de memoria automático y manual. Las opiniones están divididas sobre la forma más eficiente de administrar la memoria. Algunos programadores argumentan que el conteo de referencias es mejor porque le permite al desarrollador tener un control preciso sobre cuándo se desasignan los objetos, sin requerir la asignación manual de memoria para cada objeto que se usa en el programa, y ​​no causa los retrasos en el rendimiento asociados con los objetos automáticos. recolección de basura. Otros dicen que todo este esquema es inútil, que la recolección automática de basura estilo Java  es la mejor solución, ya que reduce en gran medida la probabilidad de errores del programador cuando se trabaja con la memoria. La recolección de basura en Cocoa no rompe la compatibilidad con versiones anteriores de los programas, se usa solo para proyectos compilados específicamente con él.

También es posible combinar estos dos enfoques. Los recolectores de basura modernos a menudo permiten que se inicien y se detengan en medio de una tarea, lo que permite que una aplicación controle la cantidad de tiempo asignado a las llamadas al sistema. La combinación de este enfoque con grupos de AppKit que se liberan automáticamente al final del bucle de mensajes parece ofrecer el mejor compromiso. Un sistema similar se ha implementado con éxito en GNUstep , el análogo de OpenStep de libre distribución de GNU .

Marcos principales

Cocoa consta principalmente de dos bibliotecas de objetos de Objective-C llamadas Frameworks . Los marcos son más o menos lo mismo que las bibliotecas dinámicas . Son objetos compilados que se cargan en el espacio de direcciones de un programa en tiempo de ejecución, pero más allá de eso, los marcos incluyen recursos, archivos de encabezado y documentación. Cocoa también incluye un sistema de control de versiones que previene los problemas encontrados en Microsoft Windows (el llamado " infierno DLL ").

Un elemento clave de la arquitectura Cocoa es el modelo de vista. Exteriormente, está organizado como un marco regular, pero implementado usando PDF para todas las operaciones de dibujo proporcionadas por Quartz . Esto permite al programador dibujar lo que quiera usando los comandos de un lenguaje similar a PostScript . Además, proporciona automáticamente la capacidad de imprimir cualquier vista. Como Cocoa se encarga de recortar, desplazar, escalar y otras tareas comunes de representación de gráficos, el programador se libera de la necesidad de implementar la infraestructura subyacente y puede concentrarse en los aspectos únicos de la aplicación que se está desarrollando.

Modelo-Vista-Comportamiento

Los equipos de programadores de Smalltalk en Xerox PARC finalmente desarrollaron una filosofía que les permitió simplificar el desarrollo y aumentar significativamente la cantidad de código reutilizable. Conocido como el paradigma Model-View-Behavior (MVC), este concepto divide una aplicación en tres conjuntos de clases que interactúan. Las clases de modelo representan datos como documentos, archivos de configuración u objetos en la memoria. Las vistas, como sugiere su nombre, muestran datos (a menudo visualmente). Las clases de comportamiento contienen la lógica que vincula los modelos a sus respectivas vistas y las mantiene sincronizadas.

En la arquitectura Cocoa se observan estrictamente los principios de MVC. En OpenStep, la mayoría de las clases eran representaciones de alto nivel (clases AppKit) o ​​clases modelo de nivel relativamente bajo (como NSString). En comparación con sistemas MVC similares, OpenStep carecía de una base de modelo sólida. Por ejemplo, no había una clase base que representara un documento. Durante la transición a Cocoa, la base del modelo se expandió increíblemente para incluir varias clases listas para usar que brindaban una funcionalidad común a la mayoría de las aplicaciones de los usuarios.

En Mac OS X 10.3, Apple presentó NSController, una familia de clases MVC que proporciona una funcionalidad de comportamiento estándar. Estas clases se consideran parte del sistema Cocoa Bindings , que hace un uso extensivo de protocolos como Key-Value Coding y Key-Value Observing . El término vinculación significa la vinculación de dos objetos, a menudo una vista y un comportamiento. Cocoa Bindings permite al desarrollador concentrarse en describir las relaciones entre los objetos, en lugar de describir el comportamiento del programa en detalle.

Con el lanzamiento de Mac OS X 10.4, Apple amplió aún más las clases principales mediante la introducción del marco Core Data , que automatiza el seguimiento de los cambios en los modelos y los guarda (por ejemplo, en un archivo). Este marco simplifica enormemente el trabajo con datos en una aplicación al proporcionar soporte automático para leer documentos de un archivo y guardarlos en un archivo, así como arquitecturas para deshacer y revertir cambios.

Al proporcionar marcos para admitir las tres capas de MVC, el objetivo de Apple es reducir la cantidad de código "pegamento" que los desarrolladores tienen que escribir y, por lo tanto, liberar su tiempo para escribir características específicas de la aplicación.

Enlace tardío

En lenguajes orientados a objetos como Java o C++ , las llamadas a métodos se representan físicamente en la memoria como punteros. Esto limita el diseño de la aplicación porque se debe conocer de antemano el nombre del método a llamar. Si bien Cocoa conserva este enfoque en su mayor parte, el enlace tardío en Objective-C permite una mayor flexibilidad.

En Objective-C, los métodos están representados por un selector , que es una cadena que describe el método que se invoca. Cuando se envía un mensaje a un objeto, el entorno de Objective-C obtiene el selector que encuentra y luego llama al método requerido. Debido a que el selector es una cadena de texto, puede guardarse en un archivo, pasarse a través de una red o entre procesos, o procesarse de alguna otra forma. La búsqueda del código que se ejecuta cuando se llama a un método se realiza en tiempo de ejecución, no en el momento de compilación del programa. Esto solo ralentiza ligeramente el rendimiento, pero aún permite que el mismo selector apunte a diferentes implementaciones del método.

De manera similar, Cocoa tiene una tecnología de objetos integral llamada codificación de valor clave (KVC). Le permite acceder a un elemento de datos o propiedad de un objeto, así como cambiarlo en tiempo de ejecución por nombre: el nombre de la propiedad actúa como una clave para su valor. KVC conduce a una flexibilidad de diseño extrema: no necesita saber el tipo de un objeto, pero cualquiera de sus propiedades se puede obtener utilizando KVC. Además, la tecnología de Cocoa llamada Key-Value Observing (KVO) sincroniza automáticamente las propiedades de los objetos que están relacionados entre sí.

Objetos ricos en funciones

Una de las cosas más útiles de Cocoa son los poderosos "objetos base" proporcionados por el sistema. Como ejemplo, consulte la Fundación NSStringy las clases NSAttributedString, que brindan soporte para cadenas Unicode , y el sistema NSTexten AppKit que permite al programador mostrar cadenas en una GUI.

NSTexty las clases relacionadas se utilizan para mostrar y editar cadenas. Estos objetos le permiten implementar cualquier cosa en la aplicación, desde el campo de entrada de texto de una línea más simple hasta un sistema de diseño que admite paginación y varias columnas, así como características tipográficas profesionales como interletraje , ligaduras , ajuste de texto alrededor de cualquier formulario, texto rotaciones, soporte completo para Unicode y suavizado de fuentes . Las propiedades de los párrafos se pueden controlar mediante programación y por parte del usuario mediante el objeto de regla, que se puede adjuntar a cualquier vista que muestre texto. La revisión ortográfica también se puede hacer automáticamente, usando un solo diccionario para todas las aplicaciones y "subrayado ondulado" promovido por Microsoft (en Cocoa se ve como una línea roja punteada). Hay soporte incorporado para deshacer y rehacer ilimitados. Usando solo la funcionalidad integrada, es posible escribir un editor de texto en 13 líneas de código . Con los nuevos objetos de controlador, este número de filas se puede reducir a cero. Esto contrasta marcadamente con la API TextEdit que se encuentra en versiones anteriores de Mac OS.

Objective-C hace que sea muy fácil ampliar la funcionalidad de las clases existentes. Es compatible con las llamadas categorías , que le permiten modificar las clases existentes "en su lugar". Con la ayuda de las categorías, puede agregar la funcionalidad requerida sin realizar cambios en ellas, e incluso sin tener acceso al código fuente de las clases existentes. En otros lenguajes más comunes, esto requeriría que el programador creara una nueva clase que admita funcionalidad adicional y luego reemplace minuciosamente todos los objetos usados ​​de la clase principal con esta nueva.

Implementaciones

Los marcos de Cocoa están escritos en Objective-C , por lo que este lenguaje es el lenguaje de elección para escribir aplicaciones de Cocoa. También está disponible un paquete para el lenguaje Java (Cocoa-Java Bridge), que, sin embargo, no es particularmente popular entre los desarrolladores. Además, el uso de enlace tardío significa que muchas características clave de Cocoa no se pueden usar en Java. En 2005, Apple anunció que Cocoa-Java quedaría obsoleto. En otras palabras, las funciones añadidas a Cocoa en versiones de Mac OS X posteriores a la 10.4 no se añadirán a la interfaz Cocoa-Java.

AppleScript Studio , incluido con Xcode Tools, permite escribir aplicaciones Cocoa simples en AppleScript . También hay un lenguaje de secuencias de comandos de terceros, F-Script , para Cocoa que permite el acceso directo a los objetos de Cocoa y proporciona un conjunto de herramientas GUI para rastrear su estado.

Los paquetes de terceros también están disponibles para otros idiomas: [2]

Además, existen implementaciones gratuitas de las partes principales de Cocoa que permiten el desarrollo de aplicaciones multiplataforma (incluido Windows ):

Hay proyectos que traducen aplicaciones Cocoa escritas en Objective - C en aplicaciones web JavaScript :

Véase también

Notas

  1. Explicación de la aparición del prefijo NS Archivado el 23 de febrero de 2011 .  (inglés) en Apple Developer Connection
  2. Vínculos de F-Script Archivado el 16 de julio de 2007.

Literatura

Enlaces