Cocoa
Cocoa это родная объектно-ориентированная среда разработки приложений для операционной системы Mac OS X производства компании Apple. Это один из пяти основных API, доступных в Mac OS X (Cocoa, Carbon, Toolbox (для работы старых приложений Mac OS 9), POSIX и Java. Такие языки, как Perl, Python и Ruby не считаются основными, так как на них пока что пишется не так много серьёзных приложений).
Приложения, использующие Cocoa, обычно разрабатываются с помощью среды разработки Apple Xcode (в прошлом называвшегося Project Builder) и Interface Builder с использованием языка Objective-C. Однако, среда Cocoa так же доступна и при разработке на других языках, таких как Ruby, Python и Perl с помощью связующих библиотек (RubyCocoa, 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 эволюционировала в Mac OS X, и «Жёлтая коробка» превратилась в Cocoa. В результате этого, названия классов Cocoa начинаются с букв NS (от NeXTStep [1]): NSString, NSArray и т.п.
Большая часть кода, написанного для OPENSTEP, вошла в Cocoa и Mac OS X, однако есть и некоторые различия. Например, в 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
делает примерно то же самое, что и метод destructor
в C++. Его вызов не гарантируется.) Подобный подход с подсчётом ссылок весьма похож на применяемый в COM от Microsoft с его интерфейсом IUnknown. IUnknown обеспечивает функциональность, аналогичную retain
и release
в форме AddRef
и Release
.
В дополнение к подсчёту ссылок, программисты могут воспользоваться автоматически высвобождаемыми пулами (autorelease pools). Посылка объекту сообщения autorelease
регистрирует объект в ближайшем автоматически высвобождаемом пуле текущего потока для высвобождения в будущем. Когда сам автоматически высвобождаемый пул высвобождается, он посылает сообщение release
на каждое посланное прежде сообщение autorelease
. Автоматически высвобождаемые пулы обычно создаются и высвобождаются в начале и в конце цикла сообщений, гарантируя, что выполнение программы выйдет за пределы блока, в котором объекты были зарегистрированы для автоматического высвобождения. Это означает, что приложение выполняется предсказуемо, и освобождение памяти происходит прозрачно для пользователя, в то время как при использовании автоматического сборщика мусора в большинстве случаев программа неожиданно перестаёт реагировать на действия пользователя при его запуске.
Автоматическая сборка мусора в Cocoa разрабатывается Apple в настоящее время. Её можно использовать в коде Objective-C 2.0 при разработке в Xcode 3.0, включённом в поставку Mac OS X 10.5 Leopard. Когда она будет доработана, программист сможет выбрать между автоматической и ручной работой с памятью. Мнения по этому поводу разделились. Некоторые программисты утверждают, что подсчёт ссылок лучше, так как он позволяет разработчику иметь точный контроль над тем, когда высвобождаются объекты, и при этом не требует выделения памяти вручную под каждый объект, который используется в программе, а также не вызывает задержек в работе, характерных для автоматической сборки мусора. Другие говорят, что вся эта схема бесполезна, что автоматическая сборка мусора в манере Java это наилучшее решение, так как она в значительной мере уменьшает вероятность ошибок программиста при работе с памятью. Когда автоматическая сборка мусора появится в Cocoa, системе придётся работать с обоими подходами, так как весь существующий Cocoa-код использует подсчёт ссылок.
Также возможно совместить эти два подхода. Современные сборщики мусора часто позволяют запускать и останавливать себя посреди выполнения задачи, что даёт возможность приложению контролировать время, выделяемое на системные вызовы. Комбинирование этого подхода с автоматически высвобождаемыми по завершении цикла сообщений пулами AppKit кажется, предлагает наилучший компромисс. Подобная система была успешно реализована в GNUStep, свободно распространяемом аналоге OpenStep от GNU.
Основные фреймворки[править | править код]
Cocoa состоит в основном из библиотек объектов Objective-C называемых фреймворками (Framework). Фреймворки это примерно то же, что и динамические библиотеки. Они представляют собой скомпилированные объекты, загружаемые в адресное пространство программы во время исполнения, но помимо того фреймворки включают ресурсы, заголовочные файлы и документацию. Cocoa также включает мощную систему контроля версий, предупреждающую проблемы, которые встречаются в Microsoft Windows.
- Foundation Kit, зачастую просто называемый Foundation, впервые появился в OpenStep. В Mac OS X он основан на Core Foundation. Foundation представляет собой объектно-ориентированную библиотеку общего назначения обеспечивающую работу со строками и значениями, контейнеры и итерацию по ним, распределённые вычисления, циклы обработки сообщений и другие функции, не привязанные напрямую к графическому интерфейсу.
- Application Kit или AppKit происходит напрямую от NeXTSTEP Application Kit. Он содержит код, с помощью которого программы могут создавать графический интерфейс и взаимодействовать с ним. AppKit построен на основе Foundation.
Один из ключевых элементов архитектуры Cocoa — это работа с представлениями (views). Она огранизована как обычный фреймворк и основана на Quartz. Это позволяет программисту рисовать всё, что угодно, используя команды языка PostScript. Это к тому же автоматически предоставляет возможность вывода любого представления на печать. Поскольку Cocoa обрабатывает обрезывание, прокрутку, масштабирование и прочие типичные задачи отображения графики, программист освобождается от необходимости реализовывать базовую инфраструктуру и может сконцентрироваться на уникальных аспектах разрабатываемого приложения.
Модель-представление-контролер[править | править код]
Команды Smalltalk-программистов из Xerox PARC в конце концов выработали философию, позволившую упростить разработку и значительно увеличить объём повторно используемого кода. Известная как «парадигма модель-представление-контролер]" (MVC), эта концепция предусматривает разделение приложения на три набора взаимодействующих между собой классов. Классы модели представляют данные, такие как документы, файлы настроек или объекты в памяти. Представления, как следует из названия, отображают данные (зачастую визуально). Классы контролера содержат логику, связывающую модели с соответствующими представлениями, и обеспечивают их синхронизацию.
В архитектуре Cocoa принципы MVC строго соблюдены. В OpenStep, большинство классов были либо представлениями высокого уровня (классы AppKit) либо относительно низкоуровневыми классами модели (например, NSString). По сравнению с похожими MVC-системами, в OpenStep недоставало сильной базы моделей. Например, не существовало базового класса, который бы представлял документ. Во время перехода к Cocoa, база моделей была невероятно расширена, и стала включать несколько готовых к употреблению классов, обеспечивавших функциональность, общую для большинства пользовательских приложений.
В Mac OS X 10.3, Apple представила семейство классов 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. Существует также разработанный сторонней компанией скриптовый язык, специально предназначенный для Cocoa, который называется F-Script, и позволяет осуществлять прямой доступ к объектам Cocoa а также имеет набор инструментов с графическим интерфейсом, позволяющих отслеживать их состояние.
Сторонние связки доступны также для других языков:
- Python — PyObjC [1]
- Ruby — RubyCocoa [2]
- Perl — CamelBones [3]
- C Sharp — Cocoa Sharp [4]
- Objective-Basic — ObjB [5]
Есть и более полный список.
Вдобавок существуют свободные реализации основных частей Cocoa, позволяющих кросс-платформенную (включая Microsoft Windows) разработку приложений:
Ссылки (на англ. яз.)[править | править код]
- 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.
Внешние ссылки (на англ. яз.)[править | править код]
- документация Cocoa от Apple
- CocoaCast — подкаст для начинающих разработчиков на Cocoa
- Список литературы, посвящённой Cocoa
- stepwise.com Cocoa для начинающих
- PyObjC
- RubyCocoa
- Cocoa Dev Central
- Cocoa Development Wiki
- Cocoa Blogs — блоги Cocoa-разработчиков
- Project Cocoa — о прежней Cocoa, также известной как KidSim
- GNUstep — свободный кросс-платформенный фреймворк, основанный на OpenStep с поддержкой основных частей Cocoa.
- Cocotron — свободный кросс-платформенный фреймворк (с акцентом на Windows) с подходом, аналогичным GNUstep.
- ActionStep — кросс-платформенный фреймворк для написания многофункциональных веб-приложений на Flash, основанный на Cocoa.
- Учебник по PyObjC от Apple
- Objective-Basic - полностью объектно-ориентированный современный вариант BASIC для Cocoa
- Become an Xcoder — Учебник в PDF, посвящённый написанию Cocoa-приложений в Xcode
- Late Night Cocoa — подкаст для Cocoa-разрабочиков
- cocoa.0x00000000.net — идеи и коды, относящиеся к Cocoa