Cocoa

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Cocoa (с англ. — «какао») — объектно-ориентированный API для операционной системы macOS от компании Apple. Это один из пяти основных API, доступных в macOS, — Cocoa, Carbon, Toolbox (для работы старых приложений Mac OS 9), POSIX и Java. Такие языки, как Perl, Python и Ruby, не считаются основными, так как на них пока что пишется не так много серьёзных приложений для macOS.

Приложения, использующие Cocoa, обычно разрабатываются с помощью среды разработки Apple Xcode (в прошлом называвшегося Project Builder) и Interface Builder с использованием языков программирования: C, Objective-C и Swift. Однако, среда Cocoa также доступна и при разработке на других языках, таких как Ruby, Python и Perl с помощью связующих библиотек (MacRuby, PyObjC и CamelBones соответственно). Также можно писать Cocoa-программы на Objective-C в обычном текстовом редакторе и вручную компилировать их с помощью GCC или make-сценариев для GNUstep.

С точки зрения конечного пользователя, Cocoa-приложения — это приложения, написанные с использованием программной среды Cocoa. Такие приложения обычно имеют характерный внешний вид, поскольку эта среда во многом упрощает поддержку принципов «человечного интерфейса» Apple (Apple Human Interface Guidelines).

История Cocoa

[править | править код]

Cocoa является продолжением программных сред NeXTSTEP и OPENSTEP, которые разрабатывались компанией NeXT в конце 1980-х годов. Apple приобрела NeXT в декабре 1996 года, и начала работу над операционной системой Rhapsody, которая должна была стать прямой наследницей OPENSTEP. Предполагалось, что она будет включать в себя так называемую «Синюю коробку» (Blue Box), для обеспечения эмуляции приложений Mac OS. База библиотек и поддержка формата исполняемых файлов OPENSTEP получила название «Жёлтой коробки» (Yellow Box). Rhapsody эволюционировала в macOS, и «Жёлтая коробка» превратилась в Cocoa. В результате этого, названия классов Cocoa начинаются с букв NS (от NeXTStep[1]): NSString, NSArray и т. п.

Большая часть кода, написанного для OPENSTEP, вошла в Cocoa и macOS, однако есть и некоторые различия. Например, в NeXTSTEP и OPENSTEP для отображения текста и графики на экране использовалась технология Display PostScript, в то время как в Cocoa используется система Quartz от Apple (в которой применяется та же модель построения изображения, что и в формате PDF). Кроме того, в Cocoa есть поддержка Интернета, например, класс NSURL и классы WebKit для работы с HTML, в то время как в OPENSTEP существовала лишь ограниченная поддержка работы с сетевыми подключениями с помощью класса NSFileHandle и Berkeley sockets.

Прежде торговая марка «Cocoa» использовалась как название приложения, позволяющего детям создавать мультимедийные проекты. Первоначально это приложение было известно как KidSim, а сейчас оно принадлежит сторонней компании и выпускается под маркой Stagecast Creator. Прекращение поддержки программы было осуществлено в русле рационализации, последовавшей за возвращением Стива Джобса в Apple. Старое название было использовано повторно, чтобы избежать задержки, связанной с регистрацией новой торговой марки, а Stagecast согласилась разрабатывать бывшую Cocoa под новым названием.

Управление памятью

[править | править код]

Одной из особенностей среды Cocoa является механизм для управления динамически выделяемой памятью. В классе NSObject, от которого порождается большинство классов Cocoa, как стандартных, так и пользовательских, для управления памятью реализован механизм подсчёта ссылок (reference counting). Объекты, порождённые от NSObject, отвечают на сообщения retain и release и хранят количество ссылок, которое можно узнать, послав объекту сообщение retainCount. Объект, заново созданный с помощью методов alloc или copy, имеет количество ссылок, равное единице. Посылка объекту сообщения retain увеличивает количество ссылок, а посылка сообщения release — уменьшает его. Когда количество ссылок достигает нуля, объект удаляется, и занимавшаяся им память освобождается (высвобождение памяти для объектов Objective-C — это то же, что и вызов деструктора у объектов C++. Метод dealloc делает примерно то же самое, что и деструктор в C++. Его вызов не гарантируется.). Подобный подход с подсчётом ссылок весьма похож на применяемый в COM от Microsoft с его интерфейсом IUnknown. IUnknown обеспечивает функциональность, аналогичную retain и release в форме AddRef и Release.

В дополнение к подсчёту ссылок, программисты могут воспользоваться автоматически высвобождаемыми пулами (autorelease pools). Посылка объекту сообщения autorelease регистрирует объект в ближайшем автоматически высвобождаемом пуле текущего потока для высвобождения в будущем. Когда сам автоматически высвобождаемый пул высвобождается, он посылает сообщение release на каждое посланное прежде сообщение autorelease. Автоматически высвобождаемые пулы обычно создаются и высвобождаются в начале и в конце цикла сообщений, гарантируя, что выполнение программы выйдет за пределы блока, в котором объекты были зарегистрированы для автоматического высвобождения. Это означает, что приложение выполняется предсказуемо, и освобождение памяти происходит прозрачно для пользователя, в то время как при использовании автоматического сборщика мусора в большинстве случаев программа неожиданно перестаёт реагировать на действия пользователя при его запуске.

Автоматическая сборка мусора в Cocoa поддерживается начиная с Objective-C 2.0 при разработке в Xcode 3.0, включённом в поставку Mac OS X 10.5 Leopard. Программист теперь имеет возможность выбрать между автоматической и ручной работой с памятью. Мнения о наиболее эффективном способе управления памятью разделились. Некоторые программисты утверждают, что подсчёт ссылок лучше, так как он позволяет разработчику иметь точный контроль над тем, когда высвобождаются объекты, и при этом не требует выделения памяти вручную под каждый объект, который используется в программе, а также не вызывает задержек в работе, характерных для автоматической сборки мусора. Другие говорят, что вся эта схема бесполезна, что автоматическая сборка мусора в манере Java — это наилучшее решение, так как она в значительной мере уменьшает вероятность ошибок программиста при работе с памятью. Сборка мусора в Cocoa не нарушает обратной совместимости программ, она используется только для проектов, специально скомпилированных с её использованием.

Также возможно совместить эти два подхода. Современные сборщики мусора часто позволяют запускать и останавливать себя посреди выполнения задачи, что даёт возможность приложению контролировать время, выделяемое на системные вызовы. Комбинирование этого подхода с автоматически высвобождаемыми по завершении цикла сообщений пулами AppKit, кажется, предлагает наилучший компромисс. Подобная система была успешно реализована в GNUstep, свободно распространяемом аналоге OpenStep от GNU.

Основные фреймворки

[править | править код]

Cocoa состоит в основном из двух библиотек о��ъектов Objective-C, называемых фреймворками (Framework). Фреймворки — это примерно то же, что и динамические библиотеки. Они представляют собой скомпилированные объекты, загружаемые в адресное пространство программы во время исполнения, но помимо этого фреймворки включают ресурсы, заголовочные файлы и документацию. Cocoa также включает систему контроля версий, предупреждающую проблемы, встречающиеся в Microsoft Windows (так называемый «DLL hell»).

  • Foundation Kit, зачастую просто называемый Foundation, впервые появился в OpenStep. В Mac OS X он основан на Core Foundation. Foundation представляет собой объектно-ориентированную библиотеку общего назначения обеспечивающую работу со строками и значениями, контейнеры и итерацию по ним, распределённые вычисления, циклы обработки сообщений и другие функции, не привязанные напрямую к графическому интерфейсу.
  • Application Kit или AppKit происходит напрямую от NeXTSTEP Application Kit. Он содержит код, с помощью которого программы могут создавать графический интерфейс и взаимодействовать с ним. AppKit построен на основе Foundation.

Ключевой элемент архитектуры Cocoa — это модель представлений (views). Внешне она организована как обычный фреймворк, но реализована с использованием PDF для всех операций рисования, предоставляемых Quartz. Это позволяет программисту рисовать всё, что угодно, используя команды языка, похожего на PostScript. Кроме того, это автоматически предоставляет возможность вывода любого представления на печать. Поскольку Cocoa обрабатывает обрезку, прокрутку, масштабирование и прочие типичные задачи отображения графики, программист освобождается от необходимости реализовывать базовую инфраструктуру и может сконцентрироваться на уникальных аспектах разрабатываемого приложения.

Модель-представление-поведение

[править | править код]

Команды Smalltalk-программистов из Xerox PARC в конце концов выработали философию, позволившую упростить разработку и значительно увеличить объём повторно используемого кода. Известная как «парадигма модель-представление-поведение» (MVC), эта концепция предусматривает разделение приложения на три набора взаимодействующих между собой классов. Классы модели представляют данные, такие как документы, файлы настроек или объекты в памяти. Представления, как следует из названия, отображают данные (зачастую визуально). Классы поведения содержат логику, связывающую модели с соответствующими представлениями, и обеспечивают их синхронизацию.

В архитектуре Cocoa принципы MVC строго соблюдены. В OpenStep, большинство классов были либо представлениями высокого уровня (классы AppKit) либо относительно низкоуровневыми классами модели (например, NSString). По сравнению с похожими MVC-системами, в OpenStep недоставало сильной базы моделей. Например, не существовало базового класса, который бы представлял документ. Во время перехода к Cocoa, база моделей была невероятно расширена, и стала включать несколько готовых к употреблению классов, обеспечивавших функциональность, общую для большинства пользовательских приложений.

В Mac OS X 10.3, Apple представила семейство классов MVC, обеспечивающее стандартную функциональность поведения — NSController. Эти классы считаются частью системы Cocoa Bindings которая широко использует такие протоколы как Key-Value Coding и Key-Value Observing. Термин binding (связка) означает связку двух объектов, часто представления и поведения. Cocoa Bindings позволяют разработчику сосредоточиться на описании связей между объектами, вместо того, чтобы детально описывать поведение программы.

С выходом Mac OS X 10.4, Apple ещё больше расширила основные классы, представив фреймворк Core Data, автоматизирующий отслеживание изменений в моделях и их сохранение (например, в файл). Этот фреймворк значительно упрощает работу с данными в приложении, предоставляя автоматическую поддержку чтения документов из файла и сохранения их в файл, а также архитектуры отмены и возвращения изменений.

Обеспечивая фреймворки для поддержки всех трёх уровней MVC, Apple ставит цель уменьшить количество «склеивающего» кода, который вынуждены писать разработчики, и освободить таким образом их время на написание уникальных для конкретного приложения функций.

Позднее связывание

[править | править код]

В таких объектно-ориентированных языках, как Java или C++ вызовы методов физически представлены в памяти в виде указателей. Это ограничивает возможности дизайна приложения, поскольку имя вызываемого метода необходимо знать заранее. Хотя Cocoa по большей части сохраняет подобный подход, позднее связывание (late binding) в Objective-C позволяет большую гибкость.

В Objective-C методы представлены селектором, то есть строкой, описывающей вызываемый метод. Когда объекту посылается сообщение, среда Objective-C получает селектор, по которому находится и затем вызывается требуемый метод. Поскольку селектор это текстовая строка, его можно сохранить в файл, передать по сети или между процессами, или обработать как-нибудь ещё. Поиск кода, выполняемого при вызове метода, осуществляется во время выполнения, а не на этапе компиляции программы. Это лишь незначительно замедляет производительность, но при этом позволяет одному и тому же селектору указывать на разные реализации метода.

Похожим образом в Cocoa устроена всеобъемлющая технология работы с объектами, называющаяся Key-Value Coding (KVC). Она позволяет обращаться к элементу данных или свойству объекта, а также изменять его во время выполнения программы по имени — имя свойства выступает в роли ключа к его значению. KVC приводит к чрезвычайной гибкости дизайна — тип объекта знать необязательно, но любое его свойство может быть получено с помощью KVC. Кроме того, с помощью технологии Cocoa, называемой Key-Value Observing (KVO), обеспечивается автоматическая синхронизация свойств объектов, связанных между собой.

Объекты с богатыми возможностями

[править | править код]

Одна из самых полезных вещей в Cocoa — это мощные «базовые объекты», предоставляемые системой. В качестве примера, обратитесь к классам Foundation NSString и NSAttributedString, которые обеспечивают поддержку Unicode-строк, и систему NSText в AppKit, позволяющую программисту отображать строки в графическом интерфейсе.

NSText и относящиеся к нему классы используются для отображения и редактирования строк. Эти объекты позволяют реализовать в приложении всё, что угодно, начиная от простейшего однострочного поля для ввода текста и заканчивая системой вёрстки с поддержкой разбиения на страницы и несколько колонок, а также профессиональных типографских функций, таких как кернинг, лигатуры, обтекание текста вокруг любых форм, повороты текста, полная поддержка Unicode и сглаживания шрифтов. Свойства абзацев могут контролироваться как программно, так и пользователем, с помощью объекта «линейка» (ruler), который может быть присоединён к любому представлению, отображающему текст. Проверка правописания также может производиться автоматически, с использованием единого словаря для всех приложений и «подчёркивания волнистой линией», впервые введённого Microsoft (в Cocoa оно имеет вид красной пунктирной линии). Есть встроенная поддержка неограниченной отмены и возвращения внесённых изменений. Используя только встроенную функциональность, можно написать текстовый редактор в 13 строк кода. С новыми объектами-контроллерами это количество строк можно свести к нулю. Это сильно контрастирует с TextEdit API, имевшемся в более ранних версиях Mac OS.

Objective-C позволяет очень просто расширять функциональность имеющихся классов. Он поддерживает так называемые категории, которые позволяют модифицировать существующие классы «на месте». С помощью категорий можно добавить требуемую функциональность, не внося в них изменений и даже вообще не имея доступа к исходному коду существующих классов. В других более распространённых языках это потребовало бы от программиста порождения нового класса, поддерживающего дополнительные функции, а затем кропотливую замену всех используемых объектов родительского класса на этот новый.

Реализации

[править | править код]

Фреймворки Cocoa написаны на Objective-C, и посему этот язык является предпочтительным для написания Cocoa-приложений. Доступна также связка для языка Java (Cocoa-Java Bridge), которая, впрочем, не особенно популярна среди разработчиков. Более того, использование позднего связывания приводит к тому, что многие ключевые функции Cocoa невозможно применять на Java. В 2005 году Apple объявила, что Cocoa-Java будет считаться устаревшей. Другими словами, функции, добавленные в Cocoa в версиях Mac OS X после 10.4 не будут добавляться в интерфейс Cocoa-Java.

AppleScript Studio, входящая в состав Xcode Tools делает возможным написание несложных Cocoa-приложений на AppleScript. Существует также разработанный сторонней компанией скриптовый язык F-Script, предназначенный для Cocoa, который позволяет осуществлять прямой доступ к объектам Cocoa и предлагает набор инструментов с графическим интерфейсом для отслеживания их состояния.

Сторонние связки доступны также для других языков:[2]

Вдобавок, существуют свободные реализации основных частей Cocoa, позволяющих кросс-платформенную (включая Windows) разработку приложений:

Есть проекты, реализующие перевод Cocoa-приложений, написанных на языке Objective-C, в веб-приложения на языке JavaScript:

Примечания

[править | править код]
  1. Объяснение появления префикса NS Архивировано 23 февраля 2011 года. (англ.) на сайте Apple Developer Connection
  2. F-Script Links Архивировано 16 июля 2007 года.

Литература

[править | править код]
  • Мэтт Нойбург. Программирование для iOS 7. Основы Objective-C, Xcode и Cocoa = iOS 7 Programming Fundamentals: Objective-C, Cocoa, and Xcode Basics. — М.: «Вильямс», 2014. — 384 с. — ISBN 978-5-8459-1895-6.
  • Aaron Hillegass: Cocoa Programming for Mac OS X, Addison-Wesley, 2nd Edition 2004, Paperback, ISBN 0-321-21314-9.
  • Stephen Kochan: Programming in Objective-C, Sams, 1st Edition 2003, Paperback, ISBN 0-672-32586-1.
  • Michael Beam, James Duncan Davidson: Cocoa in a Nutshell, O’Reilly, 1st Edition 2003, Paperback, ISBN 0-596-00462-1.
  • Erick Tejkowski: Cocoa Programming for Dummies, 1st Edition 2003, Paperback, ISBN 0-7645-2613-8.
  • Simson Garfinkel, Michael K. Mahoney: Building Cocoa Applications : A Step by Step Guide, O’Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00235-1.
  • James Duncan Davidson: Learning Cocoa with Objective-C, O’Reilly, 2nd Edition 2002, Paperback, ISBN 0-596-00301-3.
  • Scott Anguish, Erik M. Buck, Donald A. Yacktman: Cocoa Programming, Sams, 1st Edition 2002, Paperback, ISBN 0-672-32230-7.
  • Bill Cheeseman: Cocoa Recipes for Mac OS X, Peachpit Press, 1st Edition 2002, Paperback, ISBN 0-201-87801-1.
  • Andrew Duncan: Objective-C Pocket Reference, O’Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00423-0.
  • Apple Inc.: Learning Cocoa, O’Reilly, 1st Edition 2001, Paperback, ISBN 0-596-00160-6.