Cacao (API)

Compartir Imprimir Citar
Marco MacOS

Cocoa es la interfaz de programación de aplicaciones (API) nativa orientada a objetos de Apple para su sistema operativo de escritorio macOS.

Cocoa consta de los marcos Foundation Kit, Application Kit y Core Data, incluidos en el archivo de encabezado Cocoa.h, y las bibliotecas y marcos incluidos en ellos, como la biblioteca estándar de C. y el tiempo de ejecución de Objective-C.

Las aplicaciones de Cocoa generalmente se desarrollan utilizando las herramientas de desarrollo proporcionadas por Apple, específicamente Xcode (anteriormente Project Builder) e Interface Builder (ahora parte de Xcode), utilizando los lenguajes de programación Objective-C o Swift. Sin embargo, se puede acceder al entorno de programación Cocoa utilizando otras herramientas. También es posible escribir programas Cocoa Objective-C en un editor de texto simple y construirlo manualmente con GNU Compiler Collection (GCC) o Clang desde la línea de comandos o desde un archivo MAKE.

Para los usuarios finales, las aplicaciones Cocoa son aquellas escritas usando el entorno de programación Cocoa. Estas aplicaciones suelen tener un aspecto familiar, ya que el entorno de programación Cocoa proporciona una gran cantidad de elementos comunes de la interfaz de usuario (como botones, barras de desplazamiento, etc.) y automatiza muchos aspectos de una aplicación para cumplir con los requisitos humanos de Apple. directrices de interfaz.

Para iOS, iPadOS, tvOS y watchOS, existe una API similar, llamada Cocoa Touch, que incluye reconocimiento de gestos, animación y un conjunto diferente de elementos de control gráfico. Se utiliza en aplicaciones para dispositivos Apple como el iPhone, el iPod Touch, el iPad, el Apple TV y el Apple Watch.

Historia

Cocoa continúa el linaje de varios marcos de software (principalmente el App Kit y el Foundation Kit) de los entornos de programación NeXTSTEP y OpenStep desarrollados por NeXT en las décadas de 1980 y 1990. Apple adquirió NeXT en diciembre de 1996 y posteriormente se puso a trabajar en el sistema operativo Rhapsody que sería el sucesor directo de OpenStep. Debía tener una base de emulación para las aplicaciones clásicas de Mac OS, llamada Blue Box. La base de OpenStep de bibliotecas y soporte binario se denominó Caja amarilla. Rhapsody evolucionó a Mac OS X, y Yellow Box se convirtió en Cocoa. Por lo tanto, las clases de Cocoa comienzan con las letras NS, como NSString o NSArray. Estos representan el término patentado original para el marco OpenStep, NeXTSTEP.

Gran parte del trabajo que se dedicó al desarrollo de OpenStep se aplicó al desarrollo de Mac OS X, siendo Cocoa la parte más visible. Sin embargo, existen diferencias. Por ejemplo, NeXTSTEP y OpenStep usaban Display PostScript para mostrar texto y gráficos en pantalla, mientras que Cocoa depende de Quartz de Apple (que usa el modelo de imagen Portable Document Format (PDF), pero no su tecnología subyacente). Cocoa también tiene un nivel de soporte de Internet, incluidas las clases HTML NSURL y WebKit, y otras, mientras que OpenStep solo tenía un soporte rudimentario para conexiones de red administradas a través de clases NSFileHandle y conectores Berkeley.

El marco de software resultante recibió el nombre Cocoa por conveniencia, porque el nombre ya había sido registrado por Apple. Durante muchos años antes de este uso actual del nombre, la marca comercial Cocoa de Apple se había originado como el nombre de una aplicación de diseño de proyectos multimedia para niños. La aplicación se desarrolló originalmente en Apple Advanced Technology Group con el nombre KidSim, y luego se le cambió el nombre y se registró como "Cocoa". El nombre, acuñado por Peter Jensen, quien fue contratado para desarrollar Cocoa para Apple, pretendía evocar 'Java para niños', ya que se ejecutaba incrustado en las páginas web. La marca comercial, y por lo tanto el nombre "Cocoa", se reutilizó para evitar el retraso que se habría producido al registrar una nueva marca comercial para este marco de software. El original "Cacao" El programa fue descontinuado en Apple en una de las racionalizaciones que siguieron al regreso de Steve Jobs a Apple. Luego se licenció a un tercero y se comercializó como Stagecast Creator hasta 2014.

Gestión de memoria

Una característica del entorno Cocoa es su facilidad para administrar la memoria asignada dinámicamente. La clase NSObject de Foundation Kit, de la que se derivan la mayoría de las clases, tanto de proveedor como de usuario, implementa un esquema de conteo de referencia para la administración de memoria. Los objetos que se derivan de la clase raíz NSObject responden a un mensaje retain y release, y mantienen un recuento de retención. Existe un método titulado retainCount, pero contrario a su nombre, por lo general no devolverá el recuento exacto de retención de un objeto. Se utiliza principalmente para fines de nivel de sistema. Apple no recomienda invocarlo manualmente.

Un objeto recién asignado creado con alloc o copy tiene un recuento de retención de uno. Enviar a ese objeto un mensaje de retain incrementa el conteo de retenciones, mientras que enviarle un mensaje de release disminuye el conteo de retenciones. Cuando el recuento de retención de un objeto llega a cero, se desasigna mediante un procedimiento similar a un destructor de C++. No se garantiza que se invoque dealloc.

A partir de Objective-C 2.0, el tiempo de ejecución de Objective-C implementó un recolector de basura opcional, que ahora está obsoleto y en desuso a favor del recuento automático de referencias (ARC). En este modelo, el tiempo de ejecución convirtió las operaciones de conteo de referencias de Cocoa como "retain" y "liberar" en no-ops. El recolector de elementos no utilizados no existe en la implementación iOS de Objective-C 2.0. La recolección de elementos no utilizados en Objective-C se ejecutó en un subproceso en segundo plano de baja prioridad y puede detenerse en los eventos de usuario de Cocoa, con la intención de mantener la experiencia del usuario receptiva. El recolector de basura heredado todavía está disponible en Mac OS X versión 10.13, pero ninguna aplicación proporcionada por Apple lo usa.

En 2011, el compilador LLVM introdujo el conteo automático de referencias (ARC), que reemplaza al recolector de basura convencional al realizar un análisis estático del código fuente de Objective-C e insertar mensajes de retención y liberación según sea necesario.

Marcos principales

Cocoa consta de tres bibliotecas de objetos Objective-C llamadas frameworks. Los marcos son funcionalmente similares a las bibliotecas compartidas, un objeto compilado que se puede cargar dinámicamente en el espacio de direcciones de un programa en tiempo de ejecución, pero los marcos agregan recursos asociados, archivos de encabezado y documentación. Los frameworks Cocoa se implementan como un tipo de paquete, que contiene los elementos antes mencionados en ubicaciones estándar.

Una parte clave de la arquitectura Cocoa es su modelo de vistas integrales. Esto está organizado a lo largo de las líneas convencionales para un marco de aplicación, pero se basa en el modelo de dibujo en formato de documento portátil (PDF) proporcionado por Quartz. Esto permite crear contenido de dibujo personalizado utilizando comandos de dibujo similares a PostScript, lo que también permite la compatibilidad con impresoras automáticas, etc. Dado que el marco Cocoa gestiona todo el recorte, desplazamiento, escalado y otras tareas de dibujo de gráficos, el programador se libera de la implementación de la infraestructura básica y puede concentrarse en los aspectos únicos del contenido de una aplicación.

Modelo–vista–controlador

Los equipos de Smalltalk en Xerox PARC finalmente se decidieron por una filosofía de diseño que condujo a un desarrollo fácil y una alta reutilización de código. Denominado modelo-vista-controlador (MVC), el concepto divide una aplicación en tres conjuntos de clases de objetos que interactúan:

El diseño de Cocoa es una aplicación justa, pero no absolutamente estricta, de los principios de MVC. En OpenStep, la mayoría de las clases proporcionadas eran clases View de alto nivel (en AppKit) o una de varias clases modelo de nivel relativamente bajo como NSString. En comparación con sistemas MVC similares, OpenStep carecía de una capa de modelo sólida. Ninguna clase de stock representaba un "documento" por ejemplo. Durante la transición a Cocoa, la capa del modelo se amplió considerablemente, introduciendo una serie de clases predefinidas para proporcionar funcionalidades comunes a las aplicaciones de escritorio.

En Mac OS X 10.3, Apple introdujo la familia de clases NSController, que proporciona un comportamiento predefinido para la capa del controlador. Estas clases se consideran parte del sistema Cocoa Bindings, que también hace un uso extensivo de protocolos como Key-Value Observing y Key-Value Binding. El término 'vinculante' se refiere a una relación entre dos objetos, a menudo entre una vista y un controlador. Los enlaces permiten al desarrollador centrarse más en las relaciones declarativas en lugar de orquestar un comportamiento detallado.

Con la llegada de Mac OS X 10.4, Apple amplió aún más esta base al presentar el marco Core Data, que estandariza el seguimiento de cambios y la persistencia en la capa del modelo. En efecto, el marco simplifica enormemente el proceso de realizar cambios en los datos de la aplicación, deshacer los cambios cuando sea necesario, guardar los datos en el disco y volver a leerlos.

Al brindar compatibilidad con el marco para los tres dominios MVC, el objetivo de Apple es reducir la cantidad de repeticiones o "pegamento" código que los desarrolladores tienen que escribir, liberando recursos para dedicar tiempo a características específicas de la aplicación.

Enlace tardío

En la mayoría de los lenguajes orientados a objetos, las llamadas a los métodos se representan físicamente mediante un puntero al código en la memoria. Esto restringe el diseño de una aplicación ya que se necesitan clases específicas de manejo de comandos, generalmente organizadas de acuerdo con el patrón de cadena de responsabilidad. Si bien Cocoa conserva este enfoque en su mayor parte, el enlace tardío de Objective-C abre más flexibilidad.

Bajo Objective-C, los métodos están representados por un selector, una cadena que describe el método a llamar. Cuando se envía un mensaje, el selector se envía al tiempo de ejecución de Objective-C, se compara con una lista de métodos disponibles y se llama a la implementación del método. Dado que el selector son datos de texto, esto permite guardarlos en un archivo, transmitirlos a través de una red o entre procesos, o manipularlos de otras formas. La implementación del método se busca en tiempo de ejecución, no en tiempo de compilación. Hay una pequeña penalización de rendimiento por esto, pero el enlace tardío permite que el mismo selector haga referencia a diferentes implementaciones.

De manera similar, Cocoa proporciona un método generalizado de manipulación de datos llamado codificación de valores clave (KVC). Esto permite buscar o cambiar una parte de los datos o la propiedad de un objeto en tiempo de ejecución por nombre. El nombre de la propiedad actúa como una clave para el valor. En los lenguajes tradicionales, esta vinculación tardía es imposible. KVC conduce a una gran flexibilidad de diseño. No es necesario conocer el tipo de un objeto, pero cualquier propiedad de ese objeto se puede descubrir mediante KVC. Además, al extender este sistema utilizando términos de Cocoa observación de valores clave (KVO), se proporciona soporte automático para deshacer y rehacer.

El enlace estático tardío es una variante del enlace entre el enlace estático y el dinámico. El enlace de nombres antes de que se ejecute el programa se denomina estático (temprano); los enlaces realizados a medida que se ejecuta el programa son dinámicos (tardíos o virtuales).

Objetos ricos

Una de las características más útiles de Cocoa son los poderosos objetos base que proporciona el sistema. Como ejemplo, considere las clases Foundation NSString y NSAttributedString, que proporcionan cadenas Unicode, y el sistema NSText en AppKit, que permite al programador colocar objetos de cadena en la GUI.

NSText y sus clases relacionadas se utilizan para mostrar y editar cadenas. La colección de objetos involucrados permite que una aplicación implemente cualquier cosa, desde un simple campo de entrada de texto de una sola línea hasta un esquema completo de diseño de texto de varias páginas y varias columnas, con características tipográficas profesionales completas, como interletraje, ligaduras, ejecución de texto alrededor de formas arbitrarias., rotación, compatibilidad total con Unicode y reproducción de glifos suavizados. El diseño de párrafo puede ser controlado automáticamente o por el usuario, usando una "regla" objeto que se puede adjuntar a cualquier vista de texto. La revisión ortográfica es automática y utiliza un conjunto de diccionarios de idiomas para todo el sistema. El soporte ilimitado para deshacer/rehacer está integrado. Usando solo las funciones integradas, uno puede escribir una aplicación de edición de texto en tan solo 10 líneas de código. Con nuevos objetos de controlador, esto puede caer hacia cero. Cuando se necesitan extensiones, el uso de Objective-C de Cocoa hace que esta sea una tarea sencilla. Objective-C incluye el concepto de "categorías," que permite modificar la clase existente "en el lugar". La funcionalidad se puede lograr en una categoría sin ningún cambio en las clases originales en el marco, o incluso acceso a su fuente. En otros lenguajes comunes, esta misma tarea requiere derivar una nueva subclase que admita las funciones agregadas y luego reemplazar todas las instancias de la clase original con instancias de la nueva subclase.

Implementaciones y enlaces

Los frameworks Cocoa están escritos en Objective-C. Los enlaces de Java para los marcos de trabajo de Cocoa (denominados puente de Java) también se pusieron a disposición con el objetivo de reemplazar Objective-C con un lenguaje más popular, pero estos enlaces no eran populares entre los desarrolladores de Cocoa y los desarrolladores de Cocoa. la semántica de paso de mensajes no se traducía bien a un lenguaje de tipo estático como Java. La necesidad de Cocoa de enlace en tiempo de ejecución significa que muchas de las funciones clave de Cocoa no están disponibles con Java. En 2005, Apple anunció que el puente Java quedaría obsoleto, lo que significa que las funciones agregadas a Cocoa en las versiones de macOS posteriores a la 10.4 no se agregarían a la interfaz de programación Cocoa-Java.

En la Conferencia mundial de desarrolladores de Apple (WWDC) de 2014, Apple presentó un nuevo lenguaje de programación llamado Swift, que pretende reemplazar a Objective-C.

AppleScriptObjC

Originalmente, AppleScript Studio podía usarse para desarrollar aplicaciones Cocoa más simples. Sin embargo, a partir de Snow Leopard, ha quedado obsoleto. Fue reemplazado por AppleScriptObjC, que permite programar en AppleScript, mientras usa los marcos Cocoa.

Otras fijaciones

Se puede acceder al entorno de programación Cocoa utilizando otras herramientas con la ayuda de mecanismos puente como PasCocoa, PyObjC, CamelBones, RubyCocoa y D/Objective-C Bridge.

Los enlaces de terceros disponibles para otros lenguajes incluyen AppleScript, Clozure CL, Monobjc y NObjective (C#), Cocoa# (CLI), Cocodao y D/Objective-C Bridge, LispWorks, Object Pascal, CamelBones (Perl), PyObjC (Python), FPC PasCocoa (Lazarus y Free Pascal), RubyCocoa (Ruby).

Apple desarrolló anteriormente una implementación del lenguaje Ruby llamada MacRuby, que elimina la necesidad de un mecanismo de puente, mientras que Nu es un lenguaje similar a Lisp que usa el modelo de objetos Objective-C directamente y, por lo tanto, puede usar los marcos Cocoa. sin necesidad de encuadernación.

Otras implementaciones

También hay implementaciones de código abierto de partes importantes del marco Cocoa, como GNUstep y Cocotron, que permiten el desarrollo de aplicaciones Cocoa multiplataforma para apuntar a otros sistemas operativos, como Microsoft Windows y Linux.