Objective_C.pptx
- Количество слайдов: 80
Objective C/C++
Введение
Что такое Objective-C? • Объектно-ориентированный язык программирования • Расширение стандартного ANSI C
С чем работаем? • Язык Objective-C/C++ • Objective-C Runtime • Библиотеки объектов • Cocoa Touch • Среда разработки • XCode • Interface Builder
Что получаем? • Native исполняемый файл
Именование файлов • Заголовочный файл: • Код на Objective-C++: *. h *. mm
Добавляем ООП к C • Объект связывает данные и операции, которые могут взаимодействовать с этими данными. • Класс – структура, представляющая тип объекта. Объект содержит скрытый указатель на свой класс.
Добавляем ООП к C • Сообщение – действие, которое может выполнять объект. • Метод – код, который выполняется в ответ на сообщение. • Диспетчер методов – механизм для определения метода, обрабатывающего сообщение.
Программа на Objective C #import <Foundation/Foundation. h> int main(int argc, const char *argv[]) { NSLog(@”Hello, world!”); return 0; }
Строки "string" – обычная строка в C/C++ @"string" – строка-объект NSString
id • Тип данных • Обозначает любой тип объекта, независимо от его класса nil • Нулевой указатель
BOOL #define signed char BOOL #define YES (BOOL)1 #define NO (BOOL)0
Классы
Объявляем класс Файл: Shape. h @interface Shape : NSObject @end
Объявляем класс: добавляем данные @interface Shape : NSObject { float width, height; } @end
Видимость данных объекта @interface Shape : NSObject { @private float width, height; @protected // по умолчанию @package @public } @end
Объявляем класс: объявляем методы @interface Shape : NSObject { float width, height; } + (Shape*)create. Square. Shape: (float)width; - (float)height; - (void)draw; - (void)set. Width: (float)width height: (float)height; @end
Объявление метода • Метод объекта - (float)width; - (void)set. Width: (float)width height: (float)height; • Метод класса + (Shape*)create. Square. Shape: (float)width;
Специальные методы (наследуются из NSObject) • alloc – выделение памяти • init – инициализация объекта (конструктор без параметров) • dealloc – деструктор Подробнее в главе об управлении памятью
Реализуем класс Файл: Shape. m @implementation Shape - (float)width { return width; } - (void)set. Width: (float)the. Width height: (float)the. Height { width = the. Width; height = the. Height; } // другие методы @end
Используем класс Shape *shape = [Shape create. Square. Shape: 5. 0]; [shape draw]; float h = [shape height]; shape = [[Square alloc] init];
Подробнее о методах • Инфиксная форма записи: - (void)set. Value: (id)object for. Key: (NSString*)key • Имя метода: set. Value: for. Key:
Подробнее о методах: cелектор • Ссылка на имя метода • Имеет тип SEL • Все методы с одинаковым именем имеют одинаковый селектор
Подробнее о методах: работа с селекторами id helper = get. The. Receiver(); SEL request = get. The. Selector(); [helper perform. Selector: request];
Наследование: синтаксис @interface Circle : Shape { float x, y; } @end
Наследование: особенности • Множественное наследование не поддерживается • Любой метод можно переопределить
Сравнение с C++ С++ Objective C this self Base. Class: : method(); [super method]; Видимость методов: Все методы public, protected, private Виртуальные и невиртуальные методы Есть множественное наследование Все методы виртуальные Нет множественного наследования
NSObject • Корневой класс большинства иерархий • Содержит функции управления циклом жизни объекта • Выделение памяти для объекта (alloc) • Инициализация объекта (init) • Уничтожение объекта (dealloc) • Управление счётчиками ссылок • Другие функции
Размещение в памяти self isa width height x y NSObject Shape Circle
Перекрытие методов - (void)draw { … // свой код [super draw]; // … // свой код } вызов базового
Свойства @interface Shape : NSObject { int flags; } @property(nonatomic, copy) NSString *name; @property(getter=is. Complex) BOOL complex; @end
Атрибуты свойств @property(attributes) Type name; • getter=getter. Name • setter=setter. Name • readwrite • readonly (default) • assign • retain • copy (default) • nonatomic
Реализация свойств @implementation Shape // автоматическая реализация @synthesize name; // или name=variable. Name // ручная реализация - (BOOL)is. Complex { return flags & SHAPE_COMPLEX; } - (void)set. Complex: (BOOL)complex { flags = complex ? flags | SHAPE_COMPLEX : flags & ~SHAPE_COMPLEX; } @end
Использование свойств Shape *shape = …; // Dot-syntax BOOL complex = shape. complex; shape. complex = YES; NSString *name = shape. name; // так тоже можно complex = [shape is. Complex]; name = [shape name];
Протоколы
Объявление протокола @protocol Shape - (void)draw; @optional - (void)fill; @required - (void)shift: (CGPoint)offset; @end
Наследование протоколов @protocol Graphics. Primitive @end @protocol Shape<Graphics. Primitive> @end
Принятие протокола @interface Square<Shape, Some. Other. Protocol> @end
Работа с объектом только через протокол id<Protocol> obj = …; [obj protocol. Method 1];
Соответствует ли объект протоколу? if ([some. Object conforms. To. Protocol: @protocol(Protocol)] { … }
Реализует ли объект метод? if ([some. Object responds. To. Selector: @selector(some. Method)]) { [some. Object some. Method]; }
Категории Добавление методов в существующий класс
Объявление категории Файл: Shape+Transforms. h @interface Shape(Transforms) - (void)offset: (CGPoint)delta; @end
Реализация категории Файл: Shape+Transforms. m #import "Shape+Transforms. h“ @implementation Shape(Transforms) - (void)offset: (CGPoint)delta { CGPoint origin = self. origin; origin. x += delta. x; origin. y += delta. y; self. origin = origin; } @end
Категории и протоколы @interface Shape(Transforms)<Affine. Transforms> - (void)offset: (CGPoint)delta; @end
Расширения классов
Объявление расширения @interface Shape { } @end @interface Shape() @end
Зачем? • Разделение объявления интерфейса • Public и private части • Компилятор проверяет наличие реализации методов расширения в секции @implementation
Исключения
Исключения @try { NSException *exception = [NSException exception. With. Name: @"Hot. Tea. Exception" reason: @"The tea is too hot" user. Info: nil]; @throw exception; } @catch(NSException *e) { @throw; } @finally { }
Исключения • В качестве исключения можно использовать любой Objective-C объект • Часто используется NSException или его наследники
Fast Enumeration
for … in for(Type variable in expression) { statements } for(existing. Variable in expression) { statements }
Fast Enumeration • Позволяет обходить коллекции, реализующие протокол NSFast. Enumeration • Модификация коллекции в процессе обхода не допускается
Библиотеки (frameworks)
Базовые библиотеки • Foundation framework • Строки, коллекции, файлы, потоки… • App. Kit (Cocoa) • Пользовательский интерфейс Mac OS • UIKit (Cocoa Touch) • Пользовательский инерфейс i. OS
Управление памятью
NSObject - (id)alloc выделение памяти под объект - (id)init инициализация объекта - (id)dealloc разрушение объекта dealloc нельзя вызывать напрямую
NSObject Используется подсчёт ссылок на объект - (id)retain увеличить число ссылок - (void)release освободить ссылку - (id)autorelease поместить объект в autorelease pool
Основное правило управления памятью • Освобождать нужно только те объекты, которыми вы владеете • Вы становитесь владельцем объекта, если создаёте его при помощи методов с префиксами alloc, new, copy, mutable. Copy, или посылаете объекту сообщение retain. • Нужно использовать release или autorelease, чтобы «отказаться» от владения.
Пример NSArray *array = [[NSArray alloc] init]; // Вы владеете объектом array // число ссылок на array = 1 NSArrya *array. Copy = [array copy]; // Вы владеете объектом array. Copy // число ссылок на array. Copy = 1 [array release]; // Число ссылок на array = 0, // объект уничтожается.
Ещё пример - (NSArray*)find. Objects { NSMutable. Array *objects = [[[NSMutable. Array alloc] init] autorelease]; // Владение объектом передаётся // в текущий NSAutorelease. Pool через autorelease … return objects; }
NSAutorelease. Pool • Содержит объекты, которым было послано сообщение autorelease. • Отправляет сообщение release всем добавленным объектам при вызове drain. • При создании ассоциируется с потоком (помещается в стек из NSAutorelease. Pool) • Автоматически создаётся только в главном потоке.
NSAutorelease. Pool: Использование // запуск нового потока [self perform. Selector. In. Background: @selector(do. Task) with. Object: nil]; // Метод, запускающийся в отдельном потоке - (void)do. Task { // если не создать NSAutorelease. Pool // будут утечки памяти для объектов, // у которых вызван autorelease NSAutorelease. Pool *pool = [[NSAutorelease. Pool alloc] init]; … [pool drain]; }
NSAutorelease. Pool: Использование • Нужно избегать накопления объектов при выполнении длительных операций for(int i = 0; i < 1000000; i++) { NSAutorelease. Pool *pool = [[NSAutorelease. Pool alloc] init]; // интенсивное использование autorelease … [pool drain]; }
Многопоточность
@synchronized • Блокирует исполнение участка кода для выполнения только одним потоком. • Допускается повторный захват объекта блокировки потоком. @synchronized(lock. Object) { // protected code }
Блоки
Блоки • Анонимный код (функция), который: • Имеет типизированные аргументы • Имеет тип возврата • Может захватывать состояние из лексической области, где он определён
Foundation Framework
Целые типы • NSInteger • NSUInteger 32 -битные целые в 32 -битных приложениях 64 -битные целые в 64 -битных приложениях
NSString NSMutable. String • Работа со строками • Поддержка Unicode • NSString – неизменяемая строка • NSMutable. String – наследник NSString
NSString: часто используемые методы + (NSString*)string. With. Format: (NSString*)format, …; NSArray *obj = [NSArray array. With. Objects: @”str 1”, @”str 2”, nil]; [NSString string. With. Format: @”obj=%@, num=%d”, obj, num]; - (BOOL)is. Equal. To. String: (NSString*)a. String; NSString *param = …; BOOL equal = [@”string” is. Equal. To. String: param]; - (NSUInteger)length;
NSArray NSMutable. Array • Упорядоченная коллекция объектов • NSArray – неизменяемая коллекция • NSMutable. Array – изменяемая коллекция • Примитивные типы нужно оборачивать при помощи NSNumber или NSValue. • Для хранения nil – [NSNull null] • NSMutable. Array – наследник NSArray
NSArray: часто используемые методы + (NSArray*)array. With. Objects: (id)first. Ob j, … array = [NSArray array. With. Objects: @” 123”, [NSNumber number. With. Int: 123], [NSNull null], nil]; - (id)object. At. Index: (NSUInteger)index - (NSUInteger)count
NSDictionary NSMutable. Dictionary • Ассоциация значений на ключи • Ключи должны быть уникальны • Не допускается использование nil (но можно использовать [NSNull null] • NSMutable. Dictionary – наследник NSDictionary
NSDictionary: часто используемые методы + (NSDictionary*)dictionary. With. Objects. And. Keys: (id)first. Obj, … d = [NSDictionary dictionary. With. Objects. And. Keys: @” 123”, // ключ 1 [NSNumber number. With. Int: 123], [NSNumber number. With. Bool: YES], // ключ 2 @”YES”, nil]; - (id)value. For. Key: (NSString *)key - (NSUInteger)count
One more thing…
KVC = Key-Value Coding • Механизм косвенного доступа к свойствам объекта, через строки, идентифицирующие свойства [obj value. For. Key: @”text”]; [obj value. For. Key. Path: @”view. text”]; [obj set. Value: @”Hi” for. Key: @”text”]; [obj set. Value: @”Hi” for. Key. Path: @”view. text”];
KVO = Key-Value Observing • Механизм, позволяющий объектам узнавать об изменении свойств других объектов [obj add. Observer: self for. Key. Path: @”view. text” options: 0 context: NULL]; - (void)observe. Value. For. Key. Path: (NSString*)key. Path of. Object: (id)object change: (NSDictionary*)change context: (void *)context { }
Objective_C.pptx