Cocoa

Cocoa (в пер. З англ. - какао) - рідна об'єктно-орієнтована середовище розробки додатків для операційної системи Mac OS X виробництва компанії Apple. Це один з п'яти основних API, доступних в Mac OS X, - Cocoa, Carbon, Toolbox (для роботи старих додатків Mac OS 9), POSIX і Java. Такі мови, як Perl, Python і Ruby не рахуються основними, так як на них поки що пишеться не так багато серйозних додатків для Mac OS X.

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

З точки зору кінцевого користувача, Cocoa-програми це додатки, написані з використанням програмного середовища Cocoa. Такі програми зазвичай мають характерний зовнішній вигляд, оскільки це середовище багато в чому спрощує підтримку принципів "людяного інтерфейсу" Apple (Apple Human Interface Guidelines).


1. Історія 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 під новою назвою.


2. Управління пам'яттю

Однією з особливостей середовища 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.


3. Основні фреймворки

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 обробляє обрізку, прокрутку, масштабування та інші типові завдання відображення графіки, програміст звільняється від необхідності реалізовувати базову інфраструктуру і може сконцентруватися на унікальних аспектах розробляється.


4. Модель-вистава-поведінка

Команди 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 ставить мету зменшити кількість "склеює" коду, який змушені писати розробники, і звільнити таким чином їх час на написання унікальних для конкретного додатка функцій.


5. Пізніше зв'язування

У таких об'єктно-орієнтованих мовах, як Java або C + + виклики методів фізично представлені в пам'яті у вигляді покажчиків. Це обмежує можливості дизайну програми, оскільки ім'я викликається методу необхідно знати заздалегідь. Хоча Cocoa здебільшого зберігає подібний підхід, пізніше зв'язування (late binding) у Objective-C дозволяє більшу гнучкість.

У Objective-C методи представлені селектором, тобто рядком, яка описує метод, що викликається. Коли об'єкту надсилається повідомлення, середа Objective-C отримує селектор, за якою знаходиться і потім викликається необхідний метод. Оскільки селектор це текстова рядок, його можна зберегти у файл, передати по мережі або між процесами, або обробити як-небудь ще. Пошук коду, що виконується при виклику методу, здійснюється під час виконання, а не на етапі компіляції програми. Це лише незначно уповільнює продуктивність, але при цьому дозволяє одному і тому ж селектору вказувати на різні реалізації методу.

Схожим чином у Cocoa влаштована всеохоплююча технологія роботи з об'єктами, що називається Key-Value Coding (KVC). Вона дозволяє звертатися до елементу даних або властивості об'єкта, а також змінювати його під час виконання програми по імені - ім'я властивості виступає в ролі ключа до його значення. KVC призводить до надзвичайної гнучкості дизайну - тип об'єкта знати необов'язково, але будь-яке його властивість може бути отримано за допомогою KVC. Крім того, за допомогою технології Cocoa, званої Key-Value Observing (KVO), забезпечується автоматична синхронізація властивостей об'єктів, пов'язаних між собою.


6. Об'єкти з багатими можливостями

Одна з найбільш корисних речей в Cocoa це потужні "базові об'єкти", що надаються системою. Як приклад, зверніться до класів Foundation NSString і NSAttributedString, які забезпечують підтримку Unicode -рядків, і систему NSText в AppKit, що дозволяє програмісту відображати рядки в графічному інтерфейсі.

NSText і відносяться до нього класи використовуються для відображення і редагування рядків. Ці об'єкти дозволяють реалізувати в додатку все, що завгодно, починаючи від найпростішого однострочного поля для введення тексту і закінчуючи системою верстки з підтримкою розбиття на сторінки і кілька колонок, а також професійних типографських функцій, таких як кернінг, лігатури, обтікання тексту навколо будь-яких форм, повороти тексту, повна підтримка Unicode і згладжування шрифтів. Властивості абзаців можуть контролюватися як програмно, так і користувачем, за допомогою об'єкта "лінійка" (ruler), який може бути приєднаний до будь-якого поданням, отображающему текст. Перевірка правопису також може здійснюватися автоматично, з використанням єдиного словника для всіх додатків і "підкреслення хвилястою лінією", вперше введеного Microsoft (у Cocoa воно має вигляд червоної пунктирної лінії). Є вбудована підтримка необмеженої відміни і повернення внесених змін. Використовуючи тільки вбудовану функціональність, можна написати текстовий редактор в 13 рядків коду. З новими об'єктами-контролерами це кількість рядків можна звести до нуля. Це сильно контрастує з TextEdit API, имевшемся в більш ранніх версіях Mac OS.

Objective-C дозволяє дуже просто розширювати функціональність наявних класів. Він підтримує так звані категорії, які дозволяють модифікувати існуючі класи "на місці". За допомогою категорій можна додати необхідну функціональність, не вносячи до них змін і навіть взагалі не маючи доступу до вихідного коду існуючих класів. В інших більш поширені мови це вимагало б від програміста породження нового класу, що підтримує додаткові функції, а потім копітку заміну всіх використовуваних об'єктів батьківського класу на цей новий.


7. Реалізації

Фреймворки 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 (Англ.) на сайті Apple Developer Connection
  2. F-Script Links

Література

  • 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.