Введение
Cocoa — это нативный объектно-ориентированный интерфейс программирования приложений (API) Apple для настольной операционной системы macOS. Cocoa состоит из фреймворков Foundation Kit, Application Kit и Core Data, объединенных в заголовочном файле Cocoa.h, а также библиотек и фреймворков, включаемых ими, таких как стандартная библиотека C и среда выполнения Objective-C. Приложения Cocoa обычно разрабатываются с использованием инструментов разработки Apple, в частности Xcode (ранее Project Builder) и Interface Builder (теперь часть Xcode), с применением языков программирования Objective-C или Swift. Однако к среде программирования Cocoa можно получить доступ и с помощью других инструментов. Также возможно создавать программы Cocoa на Objective-C в простом текстовом редакторе и компилировать их вручную с помощью GNU Compiler Collection (GCC) или Clang из командной строки или из файла makefile. Для конечных пользователей приложения Cocoa — это программы, созданные с использованием среды программирования Cocoa. Такие приложения обычно имеют привычный внешний вид и поведение, поскольку среда программирования Cocoa предоставляет множество стандартных элементов пользовательского интерфейса (например, кнопки, полосы прокрутки и т. п.) и автоматизирует многие аспекты приложения для соответствия рекомендациям Apple по разработке пользовательского интерфейса. Для iOS, iPadOS, tvOS и watchOS существует аналогичный API под названием Cocoa Touch, который включает в себя распознавание жестов, анимацию и набор графических элементов управления, отличный от Cocoa. Он используется в приложениях для устройств Apple, таких как iPhone, iPod Touch, iPad, Apple TV и Apple Watch.
Cocoa is Apple's native object oriented application programming interface (API) for its desktop operating system macOS. Cocoa consists of the Foundation Kit, Application Kit, and Core Data frameworks, as included by the Cocoa. h header file, and the libraries and frameworks included by those, such as the C standard library and the Objective C runtime. Cocoa applications are typically developed using the development tools provided by Apple, specifically Xcode (formerly Project Builder) and Interface Builder (now part of Xcode), using the programming languages Objective C or Swift. However, the Cocoa programming environment can be accessed using other tools. It is also possible to write Objective C Cocoa programs in a simple text editor and build it manually with GNU Compiler Collection (GCC) or Clang from the command line or from a makefile. For end users, Cocoa applications are those written using the Cocoa programming environment. Such applications usually have a familiar look and feel, since the Cocoa programming environment provides a lot of common UI elements (such as buttons, scroll bars, etc. ), and automates many aspects of an application to comply with Apple's human interface guidelines. For iOS, iPadOS, tvOS, and watchOS, a similar API exists, named Cocoa Touch, which includes gesture recognition, animation, and a different set of graphical control elements. It is used in applications for Apple devices such as the iPhone, the iPod Touch, the iPad, the Apple TV, and the Apple Watch.
История
Cocoa продолжает развитие нескольких программных фреймворков (в основном App Kit и Foundation Kit) из сред программирования NeXTSTEP и OpenStep, разработанных NeXT в 1980-х и 1990-х годах. Apple приобрела NeXT в декабре 1996 года и впоследствии приступила к разработке операционной системы Rhapsody, которая должна была стать прямым преемником OpenStep. Предполагалось, что она будет включать эмуляционную среду для классических приложений Mac OS под названием Blue Box. База библиотек OpenStep и поддержка двоичного кода получила название Yellow Box. Rhapsody эволюционировала в Mac OS X, а Yellow Box стала Cocoa. Таким образом, классы Cocoa начинаются с букв NS, например, NSString или NSArray. Это сокращение от оригинального фирменного названия фреймворка OpenStep – NeXTSTEP. Большая часть работы, проделанной при разработке OpenStep, была применена к разработке Mac OS X, при этом Cocoa стала наиболее заметной частью. Однако существуют различия. Например, NeXTSTEP и OpenStep использовали Display PostScript для отображения текста и графики на экране, в то время как Cocoa полагается на Apple Quartz (который использует модель изображений Portable Document Format (PDF), но не лежащую в её основе технологию). Cocoa также обладает поддержкой работы с Интернетом, включая классы NSURL и WebKit HTML, и другие, в то время как OpenStep имел лишь базовую поддержку управляемых сетевых соединений через классы NSFileHandle и сокеты Berkeley. Изначально API-инструментарий назывался Yellow Box, а затем был переименован в Cocoa – название, которое уже было зарегистрировано Apple как торговая марка. Торговая марка Apple Cocoa изначально использовалась для приложения для разработки мультимедийных проектов для детей. Название должно было ассоциироваться с "Java для детей", поскольку приложение работало встроенным в веб-страницы. Оригинальная программа "Cocoa" была прекращена после возвращения Стива Джобса в Apple. В то время Java была одним из приоритетных направлений для компании, поэтому "Cocoa" было выбрано в качестве нового названия для "Yellow Box", поскольку к нему можно было получить доступ не только из Objective-C, но и из Java через промежуточный слой. Несмотря на то, что Apple прекратила поддержку Cocoa Java bridge, название сохранилось и даже было использовано для Cocoa Touch API.
Управление памятью
Одной из особенностей среды Cocoa является возможность управления динамически выделенной памятью. Класс NSObject из Foundation Kit, от которого наследуются большинство классов, как сторонних разработчиков, так и пользователей, реализует схему подсчёта ссылок для управления памятью. Объекты, производные от базового класса NSObject, отвечают на сообщения `retain` и `release` и ведут подсчёт ссылок. Метод `retainCount` существует, но, вопреки своему названию, обычно не возвращает точное значение счётчика ссылок объекта. Он предназначен главным образом для системных целей. Apple не рекомендует вызывать его вручную. Только что выделенный объект, созданный с помощью `alloc` или `copy`, имеет счётчик ссылок, равный единице. Отправка объекту сообщения `retain` увеличивает счётчик ссылок, а отправка сообщения `release` – уменьшает. Когда счётчик ссылок объекта достигает нуля, он освобождается с помощью процедуры, аналогичной деструктору в C++. Вызов `dealloc` не гарантируется. Начиная с Objective-C 2.0, среда выполнения Objective-C реализовала опциональный сборщик мусора, который теперь устарел и заменен автоматическим подсчётом ссылок (ARC). В этой модели среда выполнения превратила операции подсчёта ссылок Cocoa, такие как `retain` и `release`, в пустые операции. Сборщик мусора отсутствует в реализации Objective-C 2.0 для iOS. Сборка мусора в Objective-C выполнялась в фоновом потоке с низким приоритетом и могла приостанавливаться на событиях пользовательского интерфейса Cocoa, чтобы обеспечить отзывчивость. Устаревший сборщик мусора всё ещё доступен в Mac OS X версии 10.13, но ни одно приложение, поставляемое Apple, не использует его. В 2011 году компилятор LLVM представил автоматический подсчёт ссылок (ARC), который заменяет традиционный сборщик мусора, выполняя статический анализ исходного кода Objective-C и вставляя сообщения `retain` и `release` по мере необходимости.
Основные рамки
Cocoa состоит из трех библиотек объектов Objective-C, называемых фреймворками. Фреймворки функционально похожи на общие библиотеки – скомпилированные объекты, которые могут быть динамически загружены в адресное пространство программы во время выполнения, но фреймворки добавляют связанные ресурсы, файлы заголовков и документацию. Фреймворки Cocoa реализованы как тип пакета, содержащего вышеупомянутые элементы в стандартных местах. Foundation Kit (Foundation) впервые появился в Enterprise Objects Framework на NeXTSTEP 3. Он был разработан в рамках проекта OpenStep и впоследствии стал основой для AppKit OpenStep, когда эта система была выпущена в 1994 году. На macOS Foundation основан на Core Foundation. Foundation – это универсальная объектно-ориентированная библиотека, предоставляющая манипулирование строками и значениями, контейнеры и итерацию, распределенные вычисления, циклы событий (run loops) и другие функции, не связанные напрямую с графическим пользовательским интерфейсом. Префикс "NS", используемый для всех классов и констант в фреймворке, унаследован от OPENSTEP, который был совместно разработан компаниями NeXT и Sun Microsystems. Application Kit (AppKit) является прямым потомком оригинального NeXTSTEP Application Kit. Он содержит код, который программы могут использовать для создания и взаимодействия с графическими пользовательскими интерфейсами. AppKit построен на основе Foundation и использует тот же префикс NS. Core Data – это фреймворк сохранения объектов, включенный в Foundation и Cocoa и доступный в Cocoa.h. Однако позднее связывание позволяет одному и тому же селектору ссылаться на различные реализации. Аналогичным образом, Cocoa предоставляет универсальный метод манипулирования данными, называемый кодированием по ключу (KVC). Это позволяет искать или изменять данные или свойства объекта во время выполнения по имени. Имя свойства выступает в качестве ключа к значению. В традиционных языках программирования такое позднее связывание невозможно. KVC обеспечивает большую гибкость проектирования. Тип объекта необязательно должен быть известен, но любое его свойство можно обнаружить с помощью KVC. Кроме того, расширяя эту систему с помощью механизма, который Cocoa называет наблюдением за ключом (KVO), обеспечивается автоматическая поддержка отмены и повтора действий. Позднее статическое связывание – это вариант связывания, находящийся между статической и динамической связью. Связывание имен до запуска программы называется статическим (ранним); связывание, выполняемое во время работы программы, называется динамическим (поздним или виртуальным).
Богатые предметы
Одной из самых полезных особенностей Cocoa являются мощные базовые объекты, предоставляемые системой. В качестве примера рассмотрим классы Foundation NSString и NSAttributedString, обеспечивающие работу со строками Unicode, и систему NSText в AppKit, позволяющую программисту размещать строковые объекты в графическом интерфейсе. NSText и связанные с ним классы используются для отображения и редактирования строк. Набор этих объектов позволяет приложению реализовать всё – от простого однострочного текстового поля до полноценной многостраничной многоколоночной схемы разметки текста с расширенными профессиональными типографскими возможностями, такими как кернинг, лигатуры, обтекание текстом произвольных фигур, вращение, полная поддержка Unicode и сглаживание глифов. Управление разметкой абзацев может осуществляться автоматически или пользователем с помощью встроенного объекта "линейки", который можно привязать к любому текстовому представлению. Проверка орфографии выполняется автоматически, используя общесистемный набор языковых словарей. Встроена неограниченная поддержка отмены и повтора действий. Используя только встроенные возможности, можно написать приложение текстового редактора всего в 10 строк кода. С появлением новых управляющих объектов это число может сократиться практически до нуля. Когда требуются расширения, использование Cocoa и Objective-C делает эту задачу простой. Objective-C включает в себя понятие "категорий", позволяющее модифицировать существующие классы "на месте". Функциональность можно добавить в категорию без внесения изменений в исходные классы фреймворка и даже без доступа к их исходному коду. В других распространенных языках для решения той же задачи требуется создание нового подкласса с поддержкой добавленных функций и последующая замена всех экземпляров исходного класса экземплярами нового подкласса.
Реализация и обязательства
Фреймворки Cocoa написаны на Objective-C. Java-связки для фреймворков Cocoa (известные как Java-мост) также были предоставлены с целью замены Objective-C более популярным языком, но эти связки не получили популярности среди разработчиков Cocoa, а семантика передачи сообщений Cocoa плохо переносилась на статически типизированный язык, такой как Java. Потребность Cocoa в динамической привязке означает, что многие ключевые возможности Cocoa недоступны при использовании Java. В 2005 году Apple объявила о прекращении поддержки Java-моста, что означало, что функции, добавленные в Cocoa в версиях macOS после 10.4, не будут добавлены в Java-интерфейс Cocoa. На Всемирной конференции разработчиков Apple (WWDC) в 2014 году Apple представила новый язык программирования под названием Swift, который призван заменить Objective-C.
AppleScriptObjC (включает в себя)
Первоначально AppleScript Studio можно было использовать для разработки более простых приложений Cocoa. Однако, начиная с Snow Leopard, он устарел и больше не поддерживается. Ему на смену пришел AppleScriptObjC, который позволяет программировать на AppleScript с использованием фреймворков Cocoa.
Другие связующие
Доступ к среде программирования Cocoa можно получить с помощью других инструментов, используя мостовые механизмы, такие как PasCocoa, PyObjC, CamelBones, RubyCocoa и D/Objective C Bridge. Существуют сторонние привязки для других языков, включая AppleScript, Clozure CL, Monobjc и NObjective (C#), Cocoa# (CLI), Cocodao и D/Objective C Bridge, LispWorks, Object Pascal, CamelBones (Perl), PyObjC (Python), FPC PasCocoa (Lazarus и Free Pascal), RubyCocoa (Ruby). Ранее Apple разрабатывала реализацию языка Ruby под названием MacRuby, которая избавляла от необходимости в мостовом механизме, а Nu — это язык, подобный Lisp, который напрямую использует объектную модель Objective C и, следовательно, может использовать фреймворки Cocoa без привязок.
Другие варианты реализации
Существуют также реализации с открытым исходным кодом основных компонентов фреймворка Cocoa, например GNUstep и Cocotron, позволяющие разрабатывать кроссплатформенные приложения Cocoa для других операционных систем, таких как Microsoft Windows и Linux.