Objective-C — ("Обджектів Сі") , високорівнева об'єктно-орієнтована мова програмування загального призначення, розроблена у вигляді набору розширень стандартної С.
Objective-C | |
---|---|
Парадигма | об'єктно-орієнтоване програмування, d, d і Рефлексія |
Дата появи | 1986 |
Творці | Tom Love & Brad Cox |
Розробник | Apple Inc. |
Останній реліз | |
Система типізації | статична, динамічна типізація[d] і слабка типізація[d] |
Основні реалізації | Clang, GCC |
Під впливом від | Smalltalk, C |
Вплинула на | TOM, Java, Objective-J |
Операційна система | Cross-platform |
Звичайні розширення файлів | .h , .m , .mm або .C |
Вебсайт | The Objective-C Programming Language |
|
Мова програмування Objective-C, розроблена на початку 1980-х років, була основною мовою, що використовувалася компанією NeXT для операційної системи NeXTSTEP, від якої пішли macOS і iOS.
На даний час використовується в основному у macOS та GNUStep — середовищах, розроблених на основі стандарту OpenStep, та Cocoa — бібліотеки компонентів для розробки програм. Програму на Objective-C, що не використовує цих бібліотек, можна скомпілювати для будь-якої платформи, яку підтримує gcc компілятор з підтримкою Objective-C.
Objective-C є розширенням С, і тому будь-яку програму на С можна скомпілювати компілятором Objective-C.
ООП в Objective-C включає інтерфейси, класи, категорії. Реалізовано одиничне, невіртуальне спадкування. Немає єдиного базового класу для всіх об'єктів. Всі методи в класі — віртуальні. Категорія — парадигма, яка дозволяє описувати інтерфейс з методами, які «необов'язково» імплементувати.
Синтакс Objective-C породжений одночасно від С та Smalltalk. Від останньої взято основний семантичний конструкт мови — замість виклику методу об'єктові надсилається повідомлення. Наприклад, якщо клас об'єкта obj імплементує метод doJob, то говориться, що об'єкт відкликається на повідомлення doJob. Щоб надіслати повідомлення doJob цьому об'єктові, потрібно написати:
[obj doJob];
Такий механізм дозволяє надсилати повідомлення навіть до тих об'єктів, які не підтримують їхньої обробки. Такий підхід відрізняється від тих, що використовуються в статично типізованих мовах чи Java.
Історія
На початку 1980-х років було популярним структурне програмування. Воно дозволяло «розбивати» алгоритм на малі частини, в основному щоб виділити етапи алгоритму в окремі блоки і працювати з ними. Однак, із зростанням складності завдань, структурне програмування призводило до зниження якості коду. Доводилося писати все більше функцій, які дуже рідко могли використовуватися в інших програмах.
Багато хто побачив в об'єктно-орієнтованому програмуванні потенційне вирішення проблеми, яка виникла. З одного боку, Smalltalk використовували майже всі більш-менш складні системи. З іншого - використання віртуальних машин сильно гальмувало роботу системи і вимагало величезних ресурсів. ObjC створив Бред Кокс на початку 1980-х у своїй компанії Stepstone. Він намагався вирішити проблему повторного використання коду.
Метою Кокса було створення мови, яка підтримуватиме концепцію software IC. Під цією концепцією розуміється можливість збирати програми з готових компонентів (об'єктів) подібно до того, як складні електронні пристрої можуть бути легко зібрані з набору готових інтегральних мікросхем. При цьому така мова має бути досить простою і заснованою на мові С, щоб полегшити перехід розробників на неї. Однією з цілей було також створення моделі, в якій самі класи також є повноцінними об'єктами і підтримувалася б інтроспекція і динамічна обробка повідомлень.
Отримана в результаті мова Objective-C виявилася вкрай простою - на її "освоєння" у С-програміста піде всього кілька днів. Вона є саме розширенням мови С - в мову С просто додано нові можливості для об'єктно-орієнтованого програмування. При цьому будь-яка програма на С є програмою і на Objective-C.
Однією з відмінних рис Objective-C є її динамічність - цілий ряд рішень, які зазвичай приймаються на етапі компіляції, тут відкладаються безпосередньо до етапу виконання. Ще однією особливістю мови є те, що вона message-oriented, у той час як C++ - function-oriented. Це означає, що в ній виклики методу інтерпретуються не як виклик функції (хоча до цього, зазвичай, все зводиться), а саме як відправлення повідомлення (з ім'ям і аргументами) об'єкту, подібно до того, як це відбувається в Smalltalk. Такий підхід дає цілий ряд плюсів - будь-якому об'єктові можна послати будь-яке повідомлення. Об'єкт може замість обробки повідомлення просто переслати його іншому об'єктові для обробки (так зване делегування), зокрема саме так можна легко реалізувати розподілені об'єкти (тобто об'єкти, що знаходяться в різних адресних просторах і навіть на різних комп'ютерах). Прив'язка повідомлення до відповідної функції відбувається безпосередньо на етапі виконання.
Мова Objective-C підтримує нормальну роботу з метаінформацією - так у об'єкта безпосередньо на етапі виконання можна запитати його клас, список методів (з типами переданих аргументів) і instance-змінних, перевірити, чи є клас нащадком заданого і чи підтримує він заданий протокол і т. ін. У мові є нормальна підтримка протоколів (тобто поняття інтерфейсу об'єкта та протоколу чітко розділено). Для об'єктів підтримується успадкування (не множинне), для протоколів підтримується множинне успадкування. Об'єкт може бути успадкований від іншого об'єкта і відразу кількох протоколів (хоча це скоріше не успадкування протоколу, а його підтримка). На даний момент мова Objective-C підтримується компіляторами Clang і GCC (під управлінням Windows Windows використовується у складі MinGW або cygwin). Досить багато в мові перенесено на runtime-бібліотеку і сильно залежить від неї. Разом з компілятором gcc поставляється мінімальний варіант такої бібліотеки. Також можна вільно завантажити runtime-бібліотеку компанії Apple: Apple's Objective-C runtime. Ці дві runtime-бібліотеки досить схожі (в основному відмінність полягає в іменах методів), далі приклади будуть орієнтуватися на runtime-бібліотеку від компанії Apple.
Синтаксис мови
У мові Objective-C для позначення об'єктів використовується спеціальний тип id. Змінна типу id фактично є вказівником на довільний об'єкт. Для позначення нульового вказівника на об'єкт використовується константа nil (= NULL). При цьому замість id можна використовувати і більш звичне позначення з явною вказівкою класу. Зокрема останнє дозволяє компілятору здійснювати деяку перевірку підтримки повідомлення об'єктами - якщо компілятор з типу змінної не може зробити висновок про підтримку об'єктом даного повідомлення, то він видасть попередження. Тим самим мова підтримує перевірку типів, але в нестрогій формі (тобто знайдені невідповідності повертаються як попередження, а не помилки). Для відправлення повідомлень використовується наступний синтаксис:
[receiver message];
У цій конструкції receiver є вказівником на об'єкт, а message - іменем методу. На відміну від мови C + +, надсилання повідомлення nil'у є дозволеною операцією, яка завжди повертає нульове значення (nil). Повідомлення може також містити параметри:
[myRect setOrigin:30.0 :50.0];
У цьому прикладі іменем методу (повідомлення) є setOrigin. Зверніть увагу, що кожному переданому аргументу відповідає рівно одна двокрапка. При цьому в наведеному прикладі перший аргумент має мітку (текст перед двокрапкою), а другий - ні. Мова Objective-C дозволяє забезпечувати мітками кожен аргумент, що помітно підвищує читність коду і знижує ймовірність передачі неправильного параметра. Саме такий стиль прийнятий більшістю розробників.
[myRect setWidth:10.0 height:20.0];
У цьому прикладі іменем повідомлення виступає setWidth: height:. Також підтримується можливість передачі довільної кількості аргументів в повідомленні:
[myObject makeGroup: obj1, obj2, obj3, obj4, nil];
Як і функції, повідомлення можуть повертати значення. При цьому, на відміну від мови С, типом значення, яке повертається, за замовчуванням, є id.
float area = [myRect area];
Результат одного повідомлення можна відразу ж використовувати в іншому повідомленні:
[myRect setColor:[otherRect color]];
Як уже зазначалося, в Objective-C класи самі є об'єктами. Основним завданням таких об'єктів (так званих class objects) є створення екземплярів даного класу (це дуже схоже на патерн Abstract Factory). При цьому саме ім'я класу відіграє подвійну роль - з одного боку, воно виступає типом даних (тобто воно може бути використане для опису вказівників на об'єкти даного класу), а з іншого боку - ім'я класу може виступати об'єктом, якому надсилається повідомлення (в повідомленнях ім'я класу може брати участь тільки як receiver).
Rect * myRect = [[Rect alloc] init];
У мові Objective-C немає вбудованого типу для булевих величин, тому, зазвичай, такий тип вводиться штучно. Далі для логічних величин буде використовуватися тип BOOL з можливими значеннями YES і NO (як це робиться в операційних системах NextStep, Mac OS X). Першим досить серйозним застосуванням мови Objective-C було його використання в операційній системі NextStep. Для цієї системи було написано велику кількість різних класів на Objective-C, багато з яких дотепер використовуються в Mac OS X. Імена всіх цих класів починаються з префікса NS, який позначає свою приналежність до операційної системи NextStep. Зараз вони входять в бібліотеку Foundation, на якій будуються програми для OS X і iOS. З одним із них - NSString - ми ознайомимось в даній статті. Цей клас служить для роботи з рядками (при цьому для внутрішнього представлення символів використовується Юнікод). Компілятор підтримує даний тип, автоматично переводячи конструкції виду @ "my string" у вказівник на об'єкт класу NSString, який містить даний рядок (точніше його підкласу, відповідного константним рядками).
- Властивості
Припустимо, в класі Company існує instance-змінна name.
@interface Company : NSObject { NSString *name; }
Для доступу до неї ззовні найкраще скористатися властивостями, які з'явилися у Objective C 2.0. Для декларації властивостей використовується ключове слово @ property.
@property (retain) NSString *name;
У дужках перераховуються атрибути доступу до instance-змінної. Атрибути поділяються на 3 основні групи.
- Імена акцессора і мутатора
- getter = getterName, використовується для задання імені функції, яка використовується для отримання значення instance-змінної.
- setter = setterName, використовується для задання імені функції, яка використовується для задання значення instance-змінної.
- Обмеження читання / запису
- readwrite - властивість може бути "прочитана" та перезаписана
- readonly - властивість може бути тільки "прочитана"
Ці атрибути взаємовиключають один одного.
- Атрибути мутатора.
- assign - для задання нового значення використовується оператор присвоєння. Використовується тільки для POD-типів або для об'єктів, якими ми не володіємо.
- retain - вказує на те, що для об'єкта, який використовується як нове значення instance-змінної, управління пам'яттю відбувається вручну (не забуваємо потім звільнити пам'ять).
- copy - вказує на те, що для присвоєння буде використана копія переданого об'єкта.
- weak - аналог assign при застосуванні режиму автоматичного підрахунку посилань. (ARC повинен підтримуватися компілятором)
- strong - аналог retain при застосуванні режиму автоматичного підрахунку посилань. (ARC повинен підтримуватися компілятором)
При роботі під GC ніякої різниці між використанням assign, retain, copy немає. Для створення коду властивостей, згідно з тим як вони описані у декларації, можна скористатися автогенерацією коду:
@synthesize name;
Автоматично створений код - не завжди оптимальне рішення і може знадобитися створення методів доступу до instance-змінних вручну. Мову часто критикують за перевантажений, в порівнянні з іншими мовами, синтаксис. Однак при цьому нерідко відзначається його вища читність.
Створення нових класів
Всі нові директиви компілятору у мові Objective-C починаються з символу @. Як і у C + +, опис класу і його реалізація розділені (зазвичай опис поміщається у заголовному файли з розширенням h, а реалізація - у файли з розширенням m). Нижче наводиться загальна структура опису нового класу:
@interface ClassName : SuperClass { instance variable declarations } method declarations @end
У версії runtime від Apple всі класи мають спільного предка - клас NSObject, який містить цілий ряд важливих методів. Опис змінних нічим не відрізняється від опису змінних в структурах в мові С:
@interface Rect : NSObject { float width; float height; BOOL isFilled; NSColor * color; } @end
Опису методів помітно відрізняються від прийнятих в C + + і дуже сильно схожі на описи методів в мові Smalltalk. Кожний опис починається зі знака плюс або мінус. Знак плюс позначає, що даний метод є методом класу (тобто його можна надсилати тільки class object'у, а не екземплярам даного класу). Фактично методи класу є аналогами статичних методів в класах у мові C + +. Знак мінус служить для позначки методів об'єктів - екземплярів даного класу. Зверніть увагу, що в Objective-C всі методи є віртуальними, тобто можуть бути перевизначені. Нижче наводяться описи можливих методів для класу Rect.
@interface Rect : NSObject { float x, y; float width; float height; BOOL isFilled; NSColor * color; } + newRect; - (void) display; - (float) width; - (float) height; - (float) area; - (void) setWidth: (float) theWidth; - (void) setHeight: (float) theHeight; - (void) setX: (float) theX y: (float) theY; @end
Зверніть увагу, що ім'я методу може збігатися з ім'ям instance-змінної даного класу (наприклад, width і height). Тип значення, яке повертається методом, вказується у круглих дужках відразу ж після знака плюс або мінус (але перед назвою методу). Якщо тип не вказаний, то вважається, що повертається значення типу id. Далі йде ім'я методу, де після кожної двокрапки задається тип аргументу (у круглих дужках) і сам аргумент. Мова Objective-C дозволяє для аргументів методу задавати також один з наступних описувачів - oneway, in, out, inout, bycopy і byref. Дані описувачі служать для задання напряму передачі даних і способу передачі. Їх наявність помітно спрощує реалізацію та роботу з розподіленими об'єктами (які були реалізовані у операційній системі NextStep до початку 90-х років минулого століття). Метод, що приймає довільну кількість параметрів, може бути описаний таким чином:
- makeGroup: (id) object, ...;
Для підключення заголовного файлу в Objective-C використовується директива #import, аналогічна # include, але яка гарантує, що даний файл буде підключений усього один раз. У ряді випадків виникає необхідність у тому, що дане ім'я є ім'ям класу, але без явного його опису (така необхідність виникає при описі двох класів, кожен з яких посилається на інший клас). У цьому випадку можна скористатися директивою @ class, яка оголошує, що наступні за нею імена є іменами класів.
@class Shape, Rect, Oval;
Реалізація методів класу виглядає наступним чином:
#import "ClassName.h" @implementation ClassName method implementations @end
Нижче наведено приклад реалізація методів класу Rect, описаного вище.
#import "Rect.h" @implementation Rect + newRect { Rect * rect = [[Rect alloc] init]; [rect setWidth: 1.0f]; [rect setHeight: 1.0f]; [rect setX: 0.0f y: 0.0f]; return rect; } - (float) width { return width; } - (float) height { return height; } - (float) area { return [self width] * [self height]; } - (void) setWidth: (float) theWidth { width = theWidth; } - (void) setHeight: (float) theHeight { height = theHeight; } - (void) setX: (float) theX y: (float) theY { x = theX; y = theY; } @end
Як видно з прикладу, в методах доступні всі instance-змінні. Однак, як і в C + +, є можливість управляти видимістю змінних (видимістю методів керувати не можна) за допомогою директив @ private, @ protected і @ public (які діють повністю аналогічно мові C + +).
@interface Worker : NSObject { char * name; @private int age; char * evaluation; @protected int job; float wage; @public id boss }
При цьому до public змінних класу можна звертатися безпосередньо, використовуючи оператор -> (наприклад objPtr -> fieldName).
Як працює механізм повідомлень
Компілятор переводить кожне надсилання повідомлення, тобто конструкцію виду [object msg] у виклик функції objc_msgSend. Ця функція своїм першим параметром приймає вказівник на об'єкт-отримувач повідомлення, другим параметром виступає т. зв. селектор, який слугує для ідентифікації повідомлення, яке надсилається. Якщо в повідомленні присутні аргументи, то вони також передаються objc_msgSend як третій, четвертий і т. д. параметри. Кожен об'єкт Objective-C містить в собі атрибут isa - вказівник на class object для даного об'єкта. Class object автоматично створюється компілятором і існує як один екземпляр, на який через isa посилаються всі екземпляри даного класу. Кожен class object обов'язково містить у собі вказівник на class object для батьківського класу (superclass) і dispatch table. Остання являє собою словник, який співставляє селекторам повідомлень фактичні адреси методів, які їх реалізують.
Таким чином, функція objc_msgSend шукає метод із даним селектором у dispatch table для даного об'єкта. Якщо його там немає, то пошук продовжується у dispatch table для його батьківського класу і т. д. Якщо метод (тобто відповідна йому функція) знаходиться, то здійснюється його виклик з передачею всіх необхідних аргументів. В іншому випадку об'єкту дається останній шанс обробити повідомлення перед викликом винятку - селектор повідомлення разом з параметрами «загортається» у спеціальний об'єкт типу NSInvocation і об'єкту надсилається повідомлення forwardInvocation, де параметром виступає об'єкт класу NSInvocation. Якщо об'єкт підтримує forwardInvocation, то він може або сам обробити повідомлення, яке посилається, або переслати іншому об'єкту для обробки:
- (void)forwardInvocation:(NSInvocation *)anInvocation { if ( [someOtherObject respondsToSelector: [anInvocation selector]] ) [anInvocation invokeWithTarget: someOtherObject]; else .......... }
Для прискорення пошуку повідомлень по dispatch table використовується кешування, яке дозволяє помітно знизити витрати на пересилання повідомлення. Також полегшує пошук методу за таблицями використання так званих селекторів замість звичайних імен. Зазвичай селектор являє собою 32-бітну величину, що дозволяє однозначно ідентифікувати метод. Тип селектора позначається як SEL і існує ряд функцій і конструкцій, що дозволяють здійснювати перетворення імені у селектор і назад. Так для отримання селектора повідомлення безпосередньо по імені служить конструкція @ selector ():
SEL setWidth = @selector(setWidth:); SEL setPos = @selector(setPosition:y:);
Для отримання селектора по рядку символів (на етапі виконання) та перекладу селектора в рядок працюють функції NSSelectorFromString і NSStringFromSelector:
SEL setWidth = NSSelectorFromString ( @"setWidth:" ); NSString * methodName = NSStringFromSelector ( setPos );
Потужна підтримка метаінформації у Objective-C дозволяє прямо на етапі виконання перевірити чи підтримує об'єкт метод із даними селектором за допомогою надсилання йому повідомлення respondsToSelector ::
if ( [anObject respondsToSelector: @selector(setWidth:)] ) [anObject setWidth: 200.0];
Досить легко можна послати повідомлення, яке відповідає даному селектору (без аргументів, із одним, двома або трьома аргументами), за допомогою методу performSelector:, performSelector: withObject:, performSelector: withObject: withObject:, performSelector: withObject: withObject: withObject: і так далі.
[myObject performSelector:sel withObject: nil];
Зверніть увагу, що методи performSelector завжди повертають значення типу id. Можна отримати клас для даного об'єкта, надіславши йому повідомлення class. Це повідомлення повертає клас у вигляді вказівника на об'єкт типу Class.
Class * cls = [anObject class]; NSString * clsName = NSStringFromClass ( cls );
З іншого боку, також можна легко отримати відповідний class object по імені класу:
Class * cls = NSClassFromString ( clsName );
Кожен метод фактично являє собою функцію з двома невидимими аргументами - self і _cmd. Перший є аналогом this, тобто вказує на сам об'єкт - отримувач повідомлення. Другий містить селектор даного методу. Аргумент self може використовуватися для надсилання повідомлень самому собі, як. наприклад, у наступному методі:
- (float) area { return [self width] * [self height]; }
Однак крім self є ще одна величина, якій можуть надсилатися повідомлення super. Насправді super не є нормальною змінною - це всього лише ще одне позначення для вказівника на поточний об'єкт. Але при надсиланні повідомлення super пошук методу починається не з dispatch table поточного об'єкта, а із dispatch table батьківського об'єкта. Таким чином, надсилаючи повідомлення super, ми тим самим викликаємо старі версії методів, перевизначені даним класом. У мові Objective-C можна по селектору методу отримати адресу функції, яка його реалізує. Така функція відрізняється від опису методу тільки вставкою у початок списку аргументів двох додаткових параметрів - вказівника на сам об'єкт (self) і селектора даного методу (_cmd). Надіславши об'єкту повідомлення methodForSelector ми отримуємо у відповідь адресу функції, яка реалізує цей метод.
typedef float (*WidthFunc)( id, SEL ); typedef void (*SetWidthFunc)( id, SEL, float ); WidthFunc widthFunc = (WidthFunc) [myRect methodForSelector: @selector (width)]; SetWidthFunc setWidthFunc = (SetWidthFunc) [myRect methodForSelector: @selector (setWidth:)]; (*setWidthFunc)( myRect, @selector (setWidth:), 27.5f );
Це дозволяє при необхідності багаторазового виклику одного і того ж методу у заданого об'єкта повністю уникнути всіх витрат, пов'язаних з пересиланням повідомлень.
Протоколи
Мова Objective-C містить повноцінну підтримку протоколів (в C + + це абстрактний клас, який також інколи прийнято називати інтерфейсом). Протокол являє собою просто список описів методів. Об'єкт реалізує протокол, якщо він містить реалізації всіх методів, описаних в протоколі. Протоколи зручні тим, що дозволяють виділяти загальні риси у різнорідних об'єктів і передавати інформацію про об'єкти заздалегідь невідомих класів. Найпростіше опис протоколу виглядає наступним чином:
@protocol ProtocolName method declarations @end
Так протокол Serializable може бути описаний таким чином:
@protocol Serializable - (id) initWithCoder: (NSCoder *) coder; - (void) encodeWithCoder: (NSCoder *) coder; @end
Протокол може бути успадкований від довільної кількості інших протоколів:
@protocol MyProto <Protocol1, Protocol2, Serializable, Drawable>
Точно так само можна при описі класу задати не тільки батьківський клас, але і набір протоколів:
@interface MyClass : SuperClass <Protocol1, Protocol2, Serializable, Drawable>
Для перевірки під час виконання програми підтримки об'єктом заданого протоколу можна використовувати повідомлення conformsToProtocol
if ( [myObject conformsToProtocol: @protocol (Serializable)] ) [myObject encodeWithCoder: myCoder];
Крім того, ім'я протоколу (протоколів) можна використовувати при описі змінних для явної вказівки компілятору про підтримку відповідними об'єктами протоколу (протоколів). Так, якщо змінна myObject містить покажчик на об'єкт заздалегідь невідомого класу, але при цьому задовольняє протоколи Serializable і Drawable, то її можна описати таким чином:
id <Serializable,Drawable> myObject;
Точно так само, якщо заздалегідь відомо, що myObject буде містити вказівник на об'єкт, успадкований від класу Shape і підтримуючого протокол Serializable, то цю змінну можна описати таким чином:
Shape <Serializable> *myObject;
Зверніть увагу, що подібний опис служить тільки для повідомлення компілятору, які повідомлення підтримує даний об'єкт. Як і класи, всі протоколи в Objective-C представлені за допомогою об'єктів (класу Protocol):
Protocol * myProto = @protocol ( Serializable );
Для попереднього оголошення протоколів можна використовувати наступну конструкцію:
@protocol MyProto, Serializable, Drawable;
Ця конструкція повідомляє компілятор про те, що MyProto, Serializable і Drawable є іменами протоколів, які будуть визначені пізніше.
Ресурси
- Mac Developer Library [ 17 березня 2013 у Wayback Machine.]
Варіанти мови
Objective-C++
Objective-C++ - це варіант мови що приймається фронт-ендами GNU Compiler Collection та Clang, що можуть компілювати код який містить суміш синтаксисів C++ та Objective-C. Objective-C++ додає до C++ ті розширення які Objective-C додав до C. Так як нічого не зроблено для поєднання семантики різноманітних функцій мови, застосовуються деякі обмеження:
- Клас C++ не може наслідуватись від класу Objective-C і навпаки.
- Не можна оголосити простір імен C++ всередині декларації Objective-C.
- Декларації Objective-C можуть проголошуватись лише в глобальній області видимості, а не в просторі імен C++
Джерела
- Advanced Flow Control for Objective-C [ 3 квітня 2013 у Wayback Machine.]
- Debugging C-Family Languages [ 4 липня 2013 у Wayback Machine.]
- Fun with the Objective-C Runtime [ 3 квітня 2013 у Wayback Machine.]
- Steve Kochan on the Evolution of Objective-C [ 28 березня 2013 у Wayback Machine.]
- The Dynamic Languages Renaissance [ 3 квітня 2013 у Wayback Machine.]
- 1.16. Objective-C++ - Objective-C Pocket Reference [Book]. www.oreilly.com (англ.). Процитовано 7 січня 2024.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Objective C Obdzhektiv Si visokorivneva ob yektno oriyentovana mova programuvannya zagalnogo priznachennya rozroblena u viglyadi naboru rozshiren standartnoyi S Objective CParadigma ob yektno oriyentovane programuvannya d d i RefleksiyaData poyavi 1986Tvorci Tom Love amp Brad CoxRozrobnik Apple Inc Ostannij relizSistema tipizaciyi statichna dinamichna tipizaciya d i slabka tipizaciya d Osnovni realizaciyi Clang GCCPid vplivom vid Smalltalk CVplinula na TOM Java Objective JOperacijna sistema Cross platformZvichajni rozshirennya fajliv h m mm abo CVebsajt The Objective C Programming Language Mediafajli u Vikishovishi Mova programuvannya Objective C rozroblena na pochatku 1980 h rokiv bula osnovnoyu movoyu sho vikoristovuvalasya kompaniyeyu NeXT dlya operacijnoyi sistemi NeXTSTEP vid yakoyi pishli macOS i iOS Na danij chas vikoristovuyetsya v osnovnomu u macOS ta GNUStep seredovishah rozroblenih na osnovi standartu OpenStep ta Cocoa biblioteki komponentiv dlya rozrobki program Programu na Objective C sho ne vikoristovuye cih bibliotek mozhna skompilyuvati dlya bud yakoyi platformi yaku pidtrimuye gcc kompilyator z pidtrimkoyu Objective C Objective C ye rozshirennyam S i tomu bud yaku programu na S mozhna skompilyuvati kompilyatorom Objective C OOP v Objective C vklyuchaye interfejsi klasi kategoriyi Realizovano odinichne nevirtualne spadkuvannya Nemaye yedinogo bazovogo klasu dlya vsih ob yektiv Vsi metodi v klasi virtualni Kategoriya paradigma yaka dozvolyaye opisuvati interfejs z metodami yaki neobov yazkovo implementuvati Sintaks Objective C porodzhenij odnochasno vid S ta Smalltalk Vid ostannoyi vzyato osnovnij semantichnij konstrukt movi zamist vikliku metodu ob yektovi nadsilayetsya povidomlennya Napriklad yaksho klas ob yekta obj implementuye metod doJob to govoritsya sho ob yekt vidklikayetsya na povidomlennya doJob Shob nadislati povidomlennya doJob comu ob yektovi potribno napisati obj doJob Takij mehanizm dozvolyaye nadsilati povidomlennya navit do tih ob yektiv yaki ne pidtrimuyut yihnoyi obrobki Takij pidhid vidriznyayetsya vid tih sho vikoristovuyutsya v statichno tipizovanih movah S chi Java IstoriyaNa pochatku 1980 h rokiv bulo populyarnim strukturne programuvannya Vono dozvolyalo rozbivati algoritm na mali chastini v osnovnomu shob vidiliti etapi algoritmu v okremi bloki i pracyuvati z nimi Odnak iz zrostannyam skladnosti zavdan strukturne programuvannya prizvodilo do znizhennya yakosti kodu Dovodilosya pisati vse bilshe funkcij yaki duzhe ridko mogli vikoristovuvatisya v inshih programah Bagato hto pobachiv v ob yektno oriyentovanomu programuvanni potencijne virishennya problemi yaka vinikla Z odnogo boku Smalltalk vikoristovuvali majzhe vsi bilsh mensh skladni sistemi Z inshogo vikoristannya virtualnih mashin silno galmuvalo robotu sistemi i vimagalo velicheznih resursiv ObjC stvoriv Bred Koks na pochatku 1980 h u svoyij kompaniyi Stepstone Vin namagavsya virishiti problemu povtornogo vikoristannya kodu Metoyu Koksa bulo stvorennya movi yaka pidtrimuvatime koncepciyu software IC Pid ciyeyu koncepciyeyu rozumiyetsya mozhlivist zbirati programi z gotovih komponentiv ob yektiv podibno do togo yak skladni elektronni pristroyi mozhut buti legko zibrani z naboru gotovih integralnih mikroshem Pri comu taka mova maye buti dosit prostoyu i zasnovanoyu na movi S shob polegshiti perehid rozrobnikiv na neyi Odniyeyu z cilej bulo takozh stvorennya modeli v yakij sami klasi takozh ye povnocinnimi ob yektami i pidtrimuvalasya b introspekciya i dinamichna obrobka povidomlen Otrimana v rezultati mova Objective C viyavilasya vkraj prostoyu na yiyi osvoyennya u S programista pide vsogo kilka dniv Vona ye same rozshirennyam movi S v movu S prosto dodano novi mozhlivosti dlya ob yektno oriyentovanogo programuvannya Pri comu bud yaka programa na S ye programoyu i na Objective C Odniyeyu z vidminnih ris Objective C ye yiyi dinamichnist cilij ryad rishen yaki zazvichaj prijmayutsya na etapi kompilyaciyi tut vidkladayutsya bezposeredno do etapu vikonannya She odniyeyu osoblivistyu movi ye te sho vona message oriented u toj chas yak C function oriented Ce oznachaye sho v nij vikliki metodu interpretuyutsya ne yak viklik funkciyi hocha do cogo zazvichaj vse zvoditsya a same yak vidpravlennya povidomlennya z im yam i argumentami ob yektu podibno do togo yak ce vidbuvayetsya v Smalltalk Takij pidhid daye cilij ryad plyusiv bud yakomu ob yektovi mozhna poslati bud yake povidomlennya Ob yekt mozhe zamist obrobki povidomlennya prosto pereslati jogo inshomu ob yektovi dlya obrobki tak zvane deleguvannya zokrema same tak mozhna legko realizuvati rozpodileni ob yekti tobto ob yekti sho znahodyatsya v riznih adresnih prostorah i navit na riznih komp yuterah Priv yazka povidomlennya do vidpovidnoyi funkciyi vidbuvayetsya bezposeredno na etapi vikonannya Mova Objective C pidtrimuye normalnu robotu z metainformaciyeyu tak u ob yekta bezposeredno na etapi vikonannya mozhna zapitati jogo klas spisok metodiv z tipami peredanih argumentiv i instance zminnih pereviriti chi ye klas nashadkom zadanogo i chi pidtrimuye vin zadanij protokol i t in U movi ye normalna pidtrimka protokoliv tobto ponyattya interfejsu ob yekta ta protokolu chitko rozdileno Dlya ob yektiv pidtrimuyetsya uspadkuvannya ne mnozhinne dlya protokoliv pidtrimuyetsya mnozhinne uspadkuvannya Ob yekt mozhe buti uspadkovanij vid inshogo ob yekta i vidrazu kilkoh protokoliv hocha ce skorishe ne uspadkuvannya protokolu a jogo pidtrimka Na danij moment mova Objective C pidtrimuyetsya kompilyatorami Clang i GCC pid upravlinnyam Windows Windows vikoristovuyetsya u skladi MinGW abo cygwin Dosit bagato v movi pereneseno na runtime biblioteku i silno zalezhit vid neyi Razom z kompilyatorom gcc postavlyayetsya minimalnij variant takoyi biblioteki Takozh mozhna vilno zavantazhiti runtime biblioteku kompaniyi Apple Apple s Objective C runtime Ci dvi runtime biblioteki dosit shozhi v osnovnomu vidminnist polyagaye v imenah metodiv dali prikladi budut oriyentuvatisya na runtime biblioteku vid kompaniyi Apple Sintaksis moviU movi Objective C dlya poznachennya ob yektiv vikoristovuyetsya specialnij tip id Zminna tipu id faktichno ye vkazivnikom na dovilnij ob yekt Dlya poznachennya nulovogo vkazivnika na ob yekt vikoristovuyetsya konstanta nil NULL Pri comu zamist id mozhna vikoristovuvati i bilsh zvichne poznachennya z yavnoyu vkazivkoyu klasu Zokrema ostannye dozvolyaye kompilyatoru zdijsnyuvati deyaku perevirku pidtrimki povidomlennya ob yektami yaksho kompilyator z tipu zminnoyi ne mozhe zrobiti visnovok pro pidtrimku ob yektom danogo povidomlennya to vin vidast poperedzhennya Tim samim mova pidtrimuye perevirku tipiv ale v nestrogij formi tobto znajdeni nevidpovidnosti povertayutsya yak poperedzhennya a ne pomilki Dlya vidpravlennya povidomlen vikoristovuyetsya nastupnij sintaksis receiver message U cij konstrukciyi receiver ye vkazivnikom na ob yekt a message imenem metodu Na vidminu vid movi C nadsilannya povidomlennya nil u ye dozvolenoyu operaciyeyu yaka zavzhdi povertaye nulove znachennya nil Povidomlennya mozhe takozh mistiti parametri myRect setOrigin 30 0 50 0 U comu prikladi imenem metodu povidomlennya ye setOrigin Zvernit uvagu sho kozhnomu peredanomu argumentu vidpovidaye rivno odna dvokrapka Pri comu v navedenomu prikladi pershij argument maye mitku tekst pered dvokrapkoyu a drugij ni Mova Objective C dozvolyaye zabezpechuvati mitkami kozhen argument sho pomitno pidvishuye chitnist kodu i znizhuye jmovirnist peredachi nepravilnogo parametra Same takij stil prijnyatij bilshistyu rozrobnikiv myRect setWidth 10 0 height 20 0 U comu prikladi imenem povidomlennya vistupaye setWidth height Takozh pidtrimuyetsya mozhlivist peredachi dovilnoyi kilkosti argumentiv v povidomlenni myObject makeGroup obj1 obj2 obj3 obj4 nil Yak i funkciyi povidomlennya mozhut povertati znachennya Pri comu na vidminu vid movi S tipom znachennya yake povertayetsya za zamovchuvannyam ye id float area myRect area Rezultat odnogo povidomlennya mozhna vidrazu zh vikoristovuvati v inshomu povidomlenni myRect setColor otherRect color Yak uzhe zaznachalosya v Objective C klasi sami ye ob yektami Osnovnim zavdannyam takih ob yektiv tak zvanih class objects ye stvorennya ekzemplyariv danogo klasu ce duzhe shozhe na patern Abstract Factory Pri comu same im ya klasu vidigraye podvijnu rol z odnogo boku vono vistupaye tipom danih tobto vono mozhe buti vikoristane dlya opisu vkazivnikiv na ob yekti danogo klasu a z inshogo boku im ya klasu mozhe vistupati ob yektom yakomu nadsilayetsya povidomlennya v povidomlennyah im ya klasu mozhe brati uchast tilki yak receiver Rect myRect Rect alloc init U movi Objective C nemaye vbudovanogo tipu dlya bulevih velichin tomu zazvichaj takij tip vvoditsya shtuchno Dali dlya logichnih velichin bude vikoristovuvatisya tip BOOL z mozhlivimi znachennyami YES i NO yak ce robitsya v operacijnih sistemah NextStep Mac OS X Pershim dosit serjoznim zastosuvannyam movi Objective C bulo jogo vikoristannya v operacijnij sistemi NextStep Dlya ciyeyi sistemi bulo napisano veliku kilkist riznih klasiv na Objective C bagato z yakih doteper vikoristovuyutsya v Mac OS X Imena vsih cih klasiv pochinayutsya z prefiksa NS yakij poznachaye svoyu prinalezhnist do operacijnoyi sistemi NextStep Zaraz voni vhodyat v biblioteku Foundation na yakij buduyutsya programi dlya OS X i iOS Z odnim iz nih NSString mi oznajomimos v danij statti Cej klas sluzhit dlya roboti z ryadkami pri comu dlya vnutrishnogo predstavlennya simvoliv vikoristovuyetsya Yunikod Kompilyator pidtrimuye danij tip avtomatichno perevodyachi konstrukciyi vidu my string u vkazivnik na ob yekt klasu NSString yakij mistit danij ryadok tochnishe jogo pidklasu vidpovidnogo konstantnim ryadkami Vlastivosti Pripustimo v klasi Company isnuye instance zminna name interface Company NSObject NSString name Dlya dostupu do neyi zzovni najkrashe skoristatisya vlastivostyami yaki z yavilisya u Objective C 2 0 Dlya deklaraciyi vlastivostej vikoristovuyetsya klyuchove slovo property property retain NSString name U duzhkah pererahovuyutsya atributi dostupu do instance zminnoyi Atributi podilyayutsya na 3 osnovni grupi Imena akcessora i mutatora getter getterName vikoristovuyetsya dlya zadannya imeni funkciyi yaka vikoristovuyetsya dlya otrimannya znachennya instance zminnoyi setter setterName vikoristovuyetsya dlya zadannya imeni funkciyi yaka vikoristovuyetsya dlya zadannya znachennya instance zminnoyi Obmezhennya chitannya zapisu readwrite vlastivist mozhe buti prochitana ta perezapisana readonly vlastivist mozhe buti tilki prochitana Ci atributi vzayemoviklyuchayut odin odnogo Atributi mutatora assign dlya zadannya novogo znachennya vikoristovuyetsya operator prisvoyennya Vikoristovuyetsya tilki dlya POD tipiv abo dlya ob yektiv yakimi mi ne volodiyemo retain vkazuye na te sho dlya ob yekta yakij vikoristovuyetsya yak nove znachennya instance zminnoyi upravlinnya pam yattyu vidbuvayetsya vruchnu ne zabuvayemo potim zvilniti pam yat copy vkazuye na te sho dlya prisvoyennya bude vikoristana kopiya peredanogo ob yekta weak analog assign pri zastosuvanni rezhimu avtomatichnogo pidrahunku posilan ARC povinen pidtrimuvatisya kompilyatorom strong analog retain pri zastosuvanni rezhimu avtomatichnogo pidrahunku posilan ARC povinen pidtrimuvatisya kompilyatorom Pri roboti pid GC niyakoyi riznici mizh vikoristannyam assign retain copy nemaye Dlya stvorennya kodu vlastivostej zgidno z tim yak voni opisani u deklaraciyi mozhna skoristatisya avtogeneraciyeyu kodu synthesize name Avtomatichno stvorenij kod ne zavzhdi optimalne rishennya i mozhe znadobitisya stvorennya metodiv dostupu do instance zminnih vruchnu Movu chasto kritikuyut za perevantazhenij v porivnyanni z inshimi movami sintaksis Odnak pri comu neridko vidznachayetsya jogo visha chitnist Stvorennya novih klasivVsi novi direktivi kompilyatoru u movi Objective C pochinayutsya z simvolu Yak i u C opis klasu i jogo realizaciya rozdileni zazvichaj opis pomishayetsya u zagolovnomu fajli z rozshirennyam h a realizaciya u fajli z rozshirennyam m Nizhche navoditsya zagalna struktura opisu novogo klasu interface ClassName SuperClass instance variable declarations method declarations end U versiyi runtime vid Apple vsi klasi mayut spilnogo predka klas NSObject yakij mistit cilij ryad vazhlivih metodiv Opis zminnih nichim ne vidriznyayetsya vid opisu zminnih v strukturah v movi S interface Rect NSObject float width float height BOOL isFilled NSColor color end Opisu metodiv pomitno vidriznyayutsya vid prijnyatih v C i duzhe silno shozhi na opisi metodiv v movi Smalltalk Kozhnij opis pochinayetsya zi znaka plyus abo minus Znak plyus poznachaye sho danij metod ye metodom klasu tobto jogo mozhna nadsilati tilki class object u a ne ekzemplyaram danogo klasu Faktichno metodi klasu ye analogami statichnih metodiv v klasah u movi C Znak minus sluzhit dlya poznachki metodiv ob yektiv ekzemplyariv danogo klasu Zvernit uvagu sho v Objective C vsi metodi ye virtualnimi tobto mozhut buti pereviznacheni Nizhche navodyatsya opisi mozhlivih metodiv dlya klasu Rect interface Rect NSObject float x y float width float height BOOL isFilled NSColor color newRect void display float width float height float area void setWidth float theWidth void setHeight float theHeight void setX float theX y float theY end Zvernit uvagu sho im ya metodu mozhe zbigatisya z im yam instance zminnoyi danogo klasu napriklad width i height Tip znachennya yake povertayetsya metodom vkazuyetsya u kruglih duzhkah vidrazu zh pislya znaka plyus abo minus ale pered nazvoyu metodu Yaksho tip ne vkazanij to vvazhayetsya sho povertayetsya znachennya tipu id Dali jde im ya metodu de pislya kozhnoyi dvokrapki zadayetsya tip argumentu u kruglih duzhkah i sam argument Mova Objective C dozvolyaye dlya argumentiv metodu zadavati takozh odin z nastupnih opisuvachiv oneway in out inout bycopy i byref Dani opisuvachi sluzhat dlya zadannya napryamu peredachi danih i sposobu peredachi Yih nayavnist pomitno sproshuye realizaciyu ta robotu z rozpodilenimi ob yektami yaki buli realizovani u operacijnij sistemi NextStep do pochatku 90 h rokiv minulogo stolittya Metod sho prijmaye dovilnu kilkist parametriv mozhe buti opisanij takim chinom makeGroup id object Dlya pidklyuchennya zagolovnogo fajlu v Objective C vikoristovuyetsya direktiva import analogichna include ale yaka garantuye sho danij fajl bude pidklyuchenij usogo odin raz U ryadi vipadkiv vinikaye neobhidnist u tomu sho dane im ya ye im yam klasu ale bez yavnogo jogo opisu taka neobhidnist vinikaye pri opisi dvoh klasiv kozhen z yakih posilayetsya na inshij klas U comu vipadku mozhna skoristatisya direktivoyu class yaka ogoloshuye sho nastupni za neyu imena ye imenami klasiv class Shape Rect Oval Realizaciya metodiv klasu viglyadaye nastupnim chinom import ClassName h implementation ClassName method implementations end Nizhche navedeno priklad realizaciya metodiv klasu Rect opisanogo vishe import Rect h implementation Rect newRect Rect rect Rect alloc init rect setWidth 1 0f rect setHeight 1 0f rect setX 0 0f y 0 0f return rect float width return width float height return height float area return self width self height void setWidth float theWidth width theWidth void setHeight float theHeight height theHeight void setX float theX y float theY x theX y theY end Yak vidno z prikladu v metodah dostupni vsi instance zminni Odnak yak i v C ye mozhlivist upravlyati vidimistyu zminnih vidimistyu metodiv keruvati ne mozhna za dopomogoyu direktiv private protected i public yaki diyut povnistyu analogichno movi C interface Worker NSObject char name private int age char evaluation protected int job float wage public id boss Pri comu do public zminnih klasu mozhna zvertatisya bezposeredno vikoristovuyuchi operator gt napriklad objPtr gt fieldName Yak pracyuye mehanizm povidomlenKompilyator perevodit kozhne nadsilannya povidomlennya tobto konstrukciyu vidu object msg u viklik funkciyi objc msgSend Cya funkciya svoyim pershim parametrom prijmaye vkazivnik na ob yekt otrimuvach povidomlennya drugim parametrom vistupaye t zv selektor yakij sluguye dlya identifikaciyi povidomlennya yake nadsilayetsya Yaksho v povidomlenni prisutni argumenti to voni takozh peredayutsya objc msgSend yak tretij chetvertij i t d parametri Kozhen ob yekt Objective C mistit v sobi atribut isa vkazivnik na class object dlya danogo ob yekta Class object avtomatichno stvoryuyetsya kompilyatorom i isnuye yak odin ekzemplyar na yakij cherez isa posilayutsya vsi ekzemplyari danogo klasu Kozhen class object obov yazkovo mistit u sobi vkazivnik na class object dlya batkivskogo klasu superclass i dispatch table Ostannya yavlyaye soboyu slovnik yakij spivstavlyaye selektoram povidomlen faktichni adresi metodiv yaki yih realizuyut Takim chinom funkciya objc msgSend shukaye metod iz danim selektorom u dispatch table dlya danogo ob yekta Yaksho jogo tam nemaye to poshuk prodovzhuyetsya u dispatch table dlya jogo batkivskogo klasu i t d Yaksho metod tobto vidpovidna jomu funkciya znahoditsya to zdijsnyuyetsya jogo viklik z peredacheyu vsih neobhidnih argumentiv V inshomu vipadku ob yektu dayetsya ostannij shans obrobiti povidomlennya pered viklikom vinyatku selektor povidomlennya razom z parametrami zagortayetsya u specialnij ob yekt tipu NSInvocation i ob yektu nadsilayetsya povidomlennya forwardInvocation de parametrom vistupaye ob yekt klasu NSInvocation Yaksho ob yekt pidtrimuye forwardInvocation to vin mozhe abo sam obrobiti povidomlennya yake posilayetsya abo pereslati inshomu ob yektu dlya obrobki void forwardInvocation NSInvocation anInvocation if someOtherObject respondsToSelector anInvocation selector anInvocation invokeWithTarget someOtherObject else Dlya priskorennya poshuku povidomlen po dispatch table vikoristovuyetsya keshuvannya yake dozvolyaye pomitno zniziti vitrati na peresilannya povidomlennya Takozh polegshuye poshuk metodu za tablicyami vikoristannya tak zvanih selektoriv zamist zvichajnih imen Zazvichaj selektor yavlyaye soboyu 32 bitnu velichinu sho dozvolyaye odnoznachno identifikuvati metod Tip selektora poznachayetsya yak SEL i isnuye ryad funkcij i konstrukcij sho dozvolyayut zdijsnyuvati peretvorennya imeni u selektor i nazad Tak dlya otrimannya selektora povidomlennya bezposeredno po imeni sluzhit konstrukciya selector SEL setWidth selector setWidth SEL setPos selector setPosition y Dlya otrimannya selektora po ryadku simvoliv na etapi vikonannya ta perekladu selektora v ryadok pracyuyut funkciyi NSSelectorFromString i NSStringFromSelector SEL setWidth NSSelectorFromString setWidth NSString methodName NSStringFromSelector setPos Potuzhna pidtrimka metainformaciyi u Objective C dozvolyaye pryamo na etapi vikonannya pereviriti chi pidtrimuye ob yekt metod iz danimi selektorom za dopomogoyu nadsilannya jomu povidomlennya respondsToSelector if anObject respondsToSelector selector setWidth anObject setWidth 200 0 Dosit legko mozhna poslati povidomlennya yake vidpovidaye danomu selektoru bez argumentiv iz odnim dvoma abo troma argumentami za dopomogoyu metodu performSelector performSelector withObject performSelector withObject withObject performSelector withObject withObject withObject i tak dali myObject performSelector sel withObject nil Zvernit uvagu sho metodi performSelector zavzhdi povertayut znachennya tipu id Mozhna otrimati klas dlya danogo ob yekta nadislavshi jomu povidomlennya class Ce povidomlennya povertaye klas u viglyadi vkazivnika na ob yekt tipu Class Class cls anObject class NSString clsName NSStringFromClass cls Z inshogo boku takozh mozhna legko otrimati vidpovidnij class object po imeni klasu Class cls NSClassFromString clsName Kozhen metod faktichno yavlyaye soboyu funkciyu z dvoma nevidimimi argumentami self i cmd Pershij ye analogom this tobto vkazuye na sam ob yekt otrimuvach povidomlennya Drugij mistit selektor danogo metodu Argument self mozhe vikoristovuvatisya dlya nadsilannya povidomlen samomu sobi yak napriklad u nastupnomu metodi float area return self width self height Odnak krim self ye she odna velichina yakij mozhut nadsilatisya povidomlennya super Naspravdi super ne ye normalnoyu zminnoyu ce vsogo lishe she odne poznachennya dlya vkazivnika na potochnij ob yekt Ale pri nadsilanni povidomlennya super poshuk metodu pochinayetsya ne z dispatch table potochnogo ob yekta a iz dispatch table batkivskogo ob yekta Takim chinom nadsilayuchi povidomlennya super mi tim samim viklikayemo stari versiyi metodiv pereviznacheni danim klasom U movi Objective C mozhna po selektoru metodu otrimati adresu funkciyi yaka jogo realizuye Taka funkciya vidriznyayetsya vid opisu metodu tilki vstavkoyu u pochatok spisku argumentiv dvoh dodatkovih parametriv vkazivnika na sam ob yekt self i selektora danogo metodu cmd Nadislavshi ob yektu povidomlennya methodForSelector mi otrimuyemo u vidpovid adresu funkciyi yaka realizuye cej metod typedef float WidthFunc id SEL typedef void SetWidthFunc id SEL float WidthFunc widthFunc WidthFunc myRect methodForSelector selector width SetWidthFunc setWidthFunc SetWidthFunc myRect methodForSelector selector setWidth setWidthFunc myRect selector setWidth 27 5f Ce dozvolyaye pri neobhidnosti bagatorazovogo vikliku odnogo i togo zh metodu u zadanogo ob yekta povnistyu uniknuti vsih vitrat pov yazanih z peresilannyam povidomlen ProtokoliMova Objective C mistit povnocinnu pidtrimku protokoliv v C ce abstraktnij klas yakij takozh inkoli prijnyato nazivati interfejsom Protokol yavlyaye soboyu prosto spisok opisiv metodiv Ob yekt realizuye protokol yaksho vin mistit realizaciyi vsih metodiv opisanih v protokoli Protokoli zruchni tim sho dozvolyayut vidilyati zagalni risi u riznoridnih ob yektiv i peredavati informaciyu pro ob yekti zazdalegid nevidomih klasiv Najprostishe opis protokolu viglyadaye nastupnim chinom protocol ProtocolName method declarations end Tak protokol Serializable mozhe buti opisanij takim chinom protocol Serializable id initWithCoder NSCoder coder void encodeWithCoder NSCoder coder end Protokol mozhe buti uspadkovanij vid dovilnoyi kilkosti inshih protokoliv protocol MyProto lt Protocol1 Protocol2 Serializable Drawable gt Tochno tak samo mozhna pri opisi klasu zadati ne tilki batkivskij klas ale i nabir protokoliv interface MyClass SuperClass lt Protocol1 Protocol2 Serializable Drawable gt Dlya perevirki pid chas vikonannya programi pidtrimki ob yektom zadanogo protokolu mozhna vikoristovuvati povidomlennya conformsToProtocol if myObject conformsToProtocol protocol Serializable myObject encodeWithCoder myCoder Krim togo im ya protokolu protokoliv mozhna vikoristovuvati pri opisi zminnih dlya yavnoyi vkazivki kompilyatoru pro pidtrimku vidpovidnimi ob yektami protokolu protokoliv Tak yaksho zminna myObject mistit pokazhchik na ob yekt zazdalegid nevidomogo klasu ale pri comu zadovolnyaye protokoli Serializable i Drawable to yiyi mozhna opisati takim chinom id lt Serializable Drawable gt myObject Tochno tak samo yaksho zazdalegid vidomo sho myObject bude mistiti vkazivnik na ob yekt uspadkovanij vid klasu Shape i pidtrimuyuchogo protokol Serializable to cyu zminnu mozhna opisati takim chinom Shape lt Serializable gt myObject Zvernit uvagu sho podibnij opis sluzhit tilki dlya povidomlennya kompilyatoru yaki povidomlennya pidtrimuye danij ob yekt Yak i klasi vsi protokoli v Objective C predstavleni za dopomogoyu ob yektiv klasu Protocol Protocol myProto protocol Serializable Dlya poperednogo ogoloshennya protokoliv mozhna vikoristovuvati nastupnu konstrukciyu protocol MyProto Serializable Drawable Cya konstrukciya povidomlyaye kompilyator pro te sho MyProto Serializable i Drawable ye imenami protokoliv yaki budut viznacheni piznishe ResursiMac Developer Library 17 bereznya 2013 u Wayback Machine Varianti moviObjective C Objective C ce variant movi sho prijmayetsya front endami GNU Compiler Collection ta Clang sho mozhut kompilyuvati kod yakij mistit sumish sintaksisiv C ta Objective C Objective C dodaye do C ti rozshirennya yaki Objective C dodav do C Tak yak nichogo ne zrobleno dlya poyednannya semantiki riznomanitnih funkcij movi zastosovuyutsya deyaki obmezhennya Klas C ne mozhe nasliduvatis vid klasu Objective C i navpaki Ne mozhna ogolositi prostir imen C vseredini deklaraciyi Objective C Deklaraciyi Objective C mozhut progoloshuvatis lishe v globalnij oblasti vidimosti a ne v prostori imen C DzherelaAdvanced Flow Control for Objective C 3 kvitnya 2013 u Wayback Machine Debugging C Family Languages 4 lipnya 2013 u Wayback Machine Fun with the Objective C Runtime 3 kvitnya 2013 u Wayback Machine Steve Kochan on the Evolution of Objective C 28 bereznya 2013 u Wayback Machine The Dynamic Languages Renaissance 3 kvitnya 2013 u Wayback Machine 1 16 Objective C Objective C Pocket Reference Book www oreilly com angl Procitovano 7 sichnya 2024