Cocoa — это собственный объектно-ориентированный интерфейс программирования приложений (API) компании Apple для ее настольной операционной системы macOS .
Cocoa состоит из фреймворков Foundation Kit , Application Kit и Core Data , включенных в Cocoa.h
заголовочный файл, а также библиотек и фреймворков, включенных в них, таких как стандартная библиотека C и среда выполнения Objective-C. [1]
Приложения Cocoa обычно разрабатываются с использованием инструментов разработки, предоставляемых Apple, в частности Xcode (ранее Project Builder ) и Interface Builder (теперь часть Xcode), с использованием языков программирования Objective-C или Swift . Однако к среде программирования Cocoa можно получить доступ с помощью других инструментов. Также можно писать программы Objective-C Cocoa в простом текстовом редакторе и собирать их вручную с помощью GNU Compiler Collection (GCC) или Clang из командной строки или из makefile .
Для конечных пользователей приложения Cocoa — это те, которые написаны с использованием среды программирования Cocoa. Такие приложения обычно имеют знакомый вид и ощущение, поскольку среда программирования Cocoa предоставляет множество общих элементов пользовательского интерфейса (таких как кнопки, полосы прокрутки и т. д.) и автоматизирует многие аспекты приложения для соответствия рекомендациям Apple по пользовательскому интерфейсу .
Для iOS , iPadOS , tvOS и watchOS доступны API, похожие на Application Kit, называемые UIKit и WatchKit; они включают распознавание жестов , анимацию и другой набор графических элементов управления , которые разработаны для соответствия определенным платформам, на которые они нацелены. Foundation Kit и Core Data также доступны в этих операционных системах. Он используется в приложениях для устройств Apple, таких как iPhone , iPod Touch , iPad , Apple TV и 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. [2]
Большая часть работы, которая была вложена в разработку OpenStep, была применена к разработке Mac OS X, причем Cocoa была наиболее заметной частью. Однако существуют различия. Например, NeXTSTEP и OpenStep использовали Display PostScript для отображения текста и графики на экране, в то время как Cocoa зависит от Quartz от Apple (который использует модель отображения Portable Document Format (PDF), но не ее базовую технологию). Cocoa также имеет уровень поддержки Интернета, включая HTML- классы NSURL и WebKit и другие, в то время как OpenStep имел только элементарную поддержку управляемых сетевых подключений через классы NSFileHandle и сокеты Беркли .
Первоначально набор инструментов API назывался «Yellow Box», а затем был переименован в Cocoa — название, которое уже было запатентовано Apple. Торговая марка Cocoa компании Apple возникла как название приложения для разработки мультимедийных проектов для детей. Название должно было вызывать ассоциации с «Java для детей», поскольку оно было встроено в веб-страницы. [3] Первоначальная программа «Cocoa» была прекращена после возвращения Стива Джобса в Apple. В то время Java была большой областью внимания компании, поэтому «Cocoa» было использовано в качестве нового названия для «Yellow Box», поскольку, в дополнение к собственному использованию Objective-C, к нему также можно было получить доступ из Java через связующий слой. [4] Несмотря на то, что Apple прекратила поддержку моста Cocoa Java, это название сохранилось и даже использовалось для API Cocoa Touch .
Одной из особенностей среды 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 и вставляя сообщения о сохранении и освобождении по мере необходимости.
Cocoa состоит из трех библиотек объектов Objective-C , называемых фреймворками . Фреймворки функционально похожи на разделяемые библиотеки , скомпилированный объект, который может быть динамически загружен в адресное пространство программы во время выполнения, но фреймворки добавляют связанные ресурсы, заголовочные файлы и документацию. Фреймворки Cocoa реализованы как тип пакета , содержащего вышеупомянутые элементы в стандартных местах.
Ключевой частью архитектуры Cocoa является ее комплексная модель представлений. Она организована по традиционным линиям для фреймворка приложения, но основана на модели рисования Portable Document Format (PDF), предоставляемой Quartz . Это позволяет создавать пользовательский контент для рисования с использованием команд рисования, подобных PostScript , что также позволяет автоматическую поддержку принтера и т. д. Поскольку фреймворк Cocoa управляет всеми обрезками, прокруткой, масштабированием и другими рутинными задачами по рисованию графики, программист освобождается от реализации базовой инфраструктуры и может сосредоточиться на уникальных аспектах контента приложения.
Команды Smalltalk в Xerox PARC в конечном итоге остановились на философии дизайна, которая привела к легкой разработке и высокому повторному использованию кода. Названная модель–представление–контроллер (MVC), концепция разбивает приложение на три набора взаимодействующих классов объектов:
Дизайн Cocoa представляет собой довольно, но не абсолютно строгое применение принципов MVC. В OpenStep большинство предоставленных классов были либо высокоуровневыми классами View (в AppKit), либо одним из ряда относительно низкоуровневых классов моделей, таких как NSString. По сравнению с аналогичными системами MVC, в OpenStep не было сильного уровня модели. Например, ни один из стандартных классов не представлял «документ». Во время перехода на Cocoa уровень модели был значительно расширен, введя ряд предварительно скрученных классов для предоставления функциональности, общей для настольных приложений.
В Mac OS X 10.3 Apple представила семейство классов NSController, которые обеспечивают предопределенное поведение для уровня контроллера. Эти классы считаются частью системы Cocoa Bindings, которая также широко использует такие протоколы, как Key-Value Observing и Key-Value Binding. Термин «привязка» относится к связи между двумя объектами, часто между представлением и контроллером. Привязки позволяют разработчику больше сосредоточиться на декларативных связях, а не на организации детального поведения.
С появлением Mac OS X 10.4 Apple расширила эту основу еще больше, представив фреймворк Core Data , который стандартизирует отслеживание изменений и сохранение на уровне модели. По сути, фреймворк значительно упрощает процесс внесения изменений в данные приложения, отмену изменений при необходимости, сохранение данных на диске и их обратное чтение.
Предоставляя поддержку фреймворка для всех трех доменов MVC, Apple ставит перед собой цель сократить объем шаблонного или «связующего» кода, который приходится писать разработчикам, высвобождая ресурсы для работы над функциями, специфичными для приложения.
В большинстве объектно-ориентированных языков вызовы методов физически представлены указателем на код в памяти. Это ограничивает дизайн приложения, поскольку требуются определенные классы обработки команд , обычно организованные в соответствии с шаблоном цепочки ответственности . В то время как Cocoa сохраняет этот подход в основном, позднее связывание Objective-C открывает большую гибкость.
В Objective-C методы представлены селектором , строкой, описывающей вызываемый метод. Когда отправляется сообщение, селектор отправляется в среду выполнения Objective-C, сопоставляется со списком доступных методов, и вызывается реализация метода . Поскольку селектор представляет собой текстовые данные, это позволяет сохранять его в файле, передавать по сети или между процессами или манипулировать им другими способами. Реализация метода ищется во время выполнения, а не во время компиляции. Это приводит к небольшому снижению производительности [6] , но позднее связывание позволяет одному и тому же селектору ссылаться на разные реализации.
Аналогичным образом, Cocoa предоставляет всеобъемлющий метод манипулирования данными, называемый кодированием ключ-значение (KVC). [7] Это позволяет искать или изменять фрагмент данных или свойство объекта во время выполнения по имени. Имя свойства действует как ключ к значению. В традиционных языках такое позднее связывание невозможно. KVC обеспечивает большую гибкость проектирования. Тип объекта не обязательно должен быть известен, однако любое свойство этого объекта может быть обнаружено с помощью KVC. Кроме того, расширяя эту систему с помощью чего-то, что Cocoa называет наблюдением ключ-значение (KVO), обеспечивает автоматическую поддержку отмены-повтора .
Позднее статическое связывание — это вариант связывания где-то между статическим и динамическим связыванием. Связывание имен до запуска программы называется статическим ( ранним ); связывания, выполняемые во время запуска программы, называются динамическими ( поздними или виртуальными ).
Одной из самых полезных функций Cocoa являются мощные базовые объекты, предоставляемые системой. В качестве примера рассмотрим классы Foundation NSString
и NSAttributedString
, которые предоставляют строки Unicode , и систему в AppKit, которая позволяет программисту размещать строковые объекты в GUI.NSText
NSText
и связанные с ним классы используются для отображения и редактирования строк. Коллекция задействованных объектов позволяет приложению реализовать все, от простого однострочного поля ввода текста до полной многостраничной многоколоночной схемы макета текста с полными профессиональными функциями типографики , такими как кернинг , лигатуры , обтекание текстом произвольных фигур , вращение , полная поддержка Unicode и сглаженная визуализация глифов . Макет абзаца может контролироваться автоматически или пользователем с помощью встроенного объекта « линейка », который можно прикрепить к любому текстовому представлению. Проверка орфографии выполняется автоматически с использованием общесистемного набора языковых словарей. Встроена неограниченная поддержка отмены/повтора. Используя только встроенные функции, можно написать приложение текстового редактора всего за 10 строк кода. С новыми объектами контроллера это может упасть до нуля. Когда требуются расширения, использование Cocoa Objective-C делает эту задачу простой. Objective-C включает концепцию «категорий», которая позволяет изменять существующий класс «на месте». Функциональность может быть достигнута в категории без каких-либо изменений исходных классов в фреймворке или даже без доступа к его источнику. В других распространенных языках эта же задача требует выведения нового подкласса, поддерживающего добавленные функции, а затем замены всех экземпляров исходного класса экземплярами нового подкласса.
Фреймворки Cocoa написаны на Objective-C . Связывания Java для фреймворков Cocoa (называемые мостом Java ) также были доступны с целью замены Objective-C более популярным языком [8], но эти связывания были непопулярны среди разработчиков Cocoa, а семантика передачи сообщений Cocoa плохо переносилась на статически типизированный язык, такой как Java. [9] Потребность Cocoa в связывании во время выполнения означает, что многие ключевые функции Cocoa недоступны в Java. В 2005 году Apple объявила, что мост Java будет объявлен устаревшим, что означало, что функции, добавленные в Cocoa в версиях macOS позже 10.4, не будут добавлены в программный интерфейс Cocoa-Java.
На Всемирной конференции разработчиков Apple (WWDC) 2014 года компания Apple представила новый язык программирования Swift , который призван заменить Objective-C. [10]
Первоначально AppleScript Studio можно было использовать для разработки более простых приложений Cocoa. [11] Однако, начиная с Snow Leopard, он был устарел. Он был заменен на AppleScriptObjC, который позволяет программировать на AppleScript , используя фреймворки Cocoa. [12]
Доступ к среде программирования Cocoa можно получить с помощью других инструментов с помощью мостовых механизмов , таких как PasCocoa , PyObjC , CamelBones , RubyCocoa и моста D /Objective-C.
Доступные для других языков сторонние привязки включают AppleScript , Clozure CL , Monobjc и NObjective ( C# ), Cocoa# (CLI), Cocodao и D /Objective-C Bridge, [13] [14] LispWorks , Object Pascal , CamelBones ( Perl ), PyObjC ( Python ), FPC PasCocoa ( Lazarus и Free Pascal ), RubyCocoa ( Ruby ). [15]
Реализация языка Ruby под названием MacRuby , которая устраняет необходимость в механизме моста, ранее была разработана Apple, в то время как Nu — это язык, подобный Lisp , который напрямую использует объектную модель Objective-C и, таким образом, может использовать фреймворки Cocoa без необходимости привязки.
Существуют также реализации с открытым исходным кодом основных частей фреймворка Cocoa, такие как GNUstep и Cocotron, [16] , которые позволяют разрабатывать кроссплатформенные приложения Cocoa для других операционных систем, таких как Microsoft Windows и Linux .
Cocoa является важным наследием от NeXT, на что указывает .. префикс "NS"
Поскольку Java — строго типизированный язык, ему требуется больше информации о классах и интерфейсах, которыми он манипулирует во время компиляции. Поэтому перед использованием классов Objective-C в качестве классов Java необходимо написать и скомпилировать их описание.