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