Программирование Mac OS
История возникновения Архитектура Инструменты разработки Язык Библиотеки План
Steven Jobs & Stephen Wozniak
История Apple 1976 – появился Apple I 1977 – выпуск Apple I I 1979 – начинается работа над Macintosh 1982 – годовой доход превышает $1 млрд 1984 – в продажу выходит Macintosh 1985 – Jobs уходит и основывает NeXT 1991 – первый ноутбук (PowerBook) 1992 – IBM и Apple создают PowerPC 1995 – годовой доход превышает $11 млрд 1996 – Apple покупает NeXT за $430 млн
История Apple 1997 – Jobs возвращается 1998 – первый iMac 2000 – Aqua интерфейс Март 2001 – Apple выпускает Mac OS X (Cheetah) и первый iPod Сентябрь 2001 – Mac OS 10.1 (Puma) Август 2002 – Mac OS 10.2 (Jaguar) Октябрь 2003 – Mac OS 10.3 (Panther) Апрель 2005 – Mac OS 10.4 (Tiger) Октябрь 2007 – Mac OS 10.5 (Leopard) Август 2009 – Mac OS 10.6 (Snow Leopard)
Mac OS 1 (1984)
Mac OS 6 (1988)
Mac OS 7 (1991)
Mac OS 7.5 (1994)
Mac OS 8.5 (1998)
Mac OS 9 (1999)
Mac OS 10 (2001)
Mac OS 10.6 (2009)
Hackintosh (2006) Mac OS и старше Патчи к XNU
MessagePad
MessagePad & iPhone
Особенности Mac OS X Darwin: XNU + набор драйверов и утилит XNU: ядро Mach + BSD API Фреймворки Cocoa, Carbon и Java Технологии QuickTime, Quartz и OpenGL Тема Aqua
Архитектурная модель Aqua Darwin QuartzOpenGLQuickTime CarbonCocoaJava GUI Фреймворки Технологии Ядро
XNU = Mach + BSD Mach: - виртуальная память - RPC - вытесняющее планирование и SMP - защита памяти - IPC BSD: - POSIX интерфейс - сигналы - стек TCP\IP - VFS
И еще раз…
Toolkit GCC GDB Make Libtool Otool
Компиляция из командной строки
Bundle
XCode
Interface Builder
developer.apple.com
Objective-C Надмножество С Очень простой язык, но новый синтаксис Одиночное наследование, единый базовый класс Есть понятие интерфейса (абстрактный класс) Методы бывают либо виртуальные либо статические Слабо типизирован
Objective-C Новые типы: - анонимный объект (id) - класс (Class) - селектор (SEL) Синтаксис объявления и определения класса Синтаксис вызова метода
Objective-C Все динамично: - объекты создаются в куче - нет стековых объектов Методы связываются динамически Присутствует интроспекция
Создание объекта из класса
Objective-C Классы определяют состояние и поведение Состояние определяется инвариантами Поведение – методами Менять состояние можно методами доступа (accessors)
Objective-C Объекты отвечают на методы объекта: - (id)init; - (float)height; - (void)walk; Классы отвечают на методы классов: + (id)alloc; + (id)person; + (Person *)sharedPerson;
Objective-C Синтаксис вызова метода (посылки сообщения): [receiver message] [receiver message: argument] [receiver message: arg1 andArg: arg2]
Objective-C Пример: Person *voter = [[Person alloc] init]; int age = [voter age]; [voter setAge: 21] if ([voter canLegallyVote]) {/*do smth*/} [voter NSString *name = [[voter spouse] name];
Objective-C Точечный синтаксис (ObjC 2.0): float height = [person height]; float height = person.height; [person setHeight: newHeight]; person.height = newHeight; [[person child] setHeight: newHeight]; person.child.height = newHeight;
Objective-C Нулевой указатель: if (nil == person) return; if (!person) return; person = nil; [button setTarget: nil]; person = nil; [person die];
Objective-C Макросы для типа BOOL: BOOL flag = NO; if (flag) return; else flag = YES flag = 1; if (flag) return; else flag = 0;
Objective-C Тип SEL как указатель на метод: SEL action = [button action]; [button Для методов из нескольких слов: - (void)setName: (NSString *)name age: (int)age; SEL sel
Objective-C Можно определить, отвечает ли объект на некоторое сообщение: id obj; SEL selector if ([obj respondsToSelector: selector]) [obj performSelector: selector withObjects: self];
Objective-C Сравнение указателей: if (obj1 == obj2) exact object instance); Сравнение состояний: if ([obj1 isEqual: obj2]) equivalent);
Objective-C Специальный метод-описание: - (NSString *)description; Используется в форматной строке: [NSString description: myObject]; NSLog([anObject description]);
Foundation Framework Содержит классы для АТД Задачи, таймера, нити Работа с файлами, IPC, bundle NSObject: - всеобщий базовый класс - управление памятью - сравнение объектов - интроспекция
Foundation Контейнеры NSArray - упорядоченный массив объектов NSDictionary – ключ-значение NSSet – множество уникальных объектов Единый механизм перечисления Константные и изменяемые классы NSMutableArray, NSMutableDictionary, NSMutableSet
Foundation Контейнеры Перечисление элементов контейнера: NSArray *colors = @Green, nil]; NSString *color; int count = [colors count]; for (i = 0; i < count; ++i ) //old style { color = [array objectAtIndex: i]; NSLog(color); } for (Color *color in colors ) //new style NSLog(color);
Файлы описания классов
Объявление класса
Определение методов доступа
Вызов собственных методов
Вызов методов родителя self – аналог this super – псевдоним объекта-родителя - (void)doSomething { [super doSomething]; //… }
Создание объекта + alloc – выделение памяти для объекта некоторого класса (увеличивается счетчик ссылок) - init – вызов конструктора MyClass *object = [[MyClass alloc] init];
Реализация конструктора
Сбалансированные вызовы
Управление памятью
Реализация деструктора
Вопросы?