Objective-C 2.0: краткое описание языка и рантайма

  • 2,594 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,594
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
23
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • - Почему рассказываю про язык
    - Intended audience
  • - Основные типы и конструкции из Си
    - Пример кода - двоичное дерево
  • - #import, ключевые слова
    - 2 части: @interface и @implementation
    - Наследование от NSObject
    - Сначала поля
    - Описание свойств, методов, типов, как методы выглядят
  • - О @synthesise
    - Вызов методов
  • - Очень похоже на C#/Java
  • - В left и right нет проверки на nil
  • - Допустим, хотим добавить новый traverse
    - Отдельно от основного описания класса
    - Даже для классов из библиотеки
    - Новые поля объявлять нельзя
  • - Необязательный - значит можно написать свой, но сложно
  • - Не managed мир
    - Есть сборщик, но только в “большом” рантайме
    - Т.е. ваш метод, который создает объект, ответственен за освобожнение
  • - Выделяем сами, освобождаем сами
    - descr - часть NSArray, и тоже освободится
    - retain - чтобы не собрался
  • - Наш метод возвращает объект - autorelease
    - NSAutoreleasePool. Может быть вложенным
    - Есть глобальный NSAutoreleasePool в main под iPhone
  • - Отсылка сообщений отличается и концептуально
    - Код не вызовет ошибок компиляции/выполнения (id array)
    - Связывание во время выполнения
  • - Тот же код, но теперь неизвестный метод
    - Компилятор выдаст только warning, ошибка может быть в рантайме
  • - Итак, поговорим о рантайме
    - Выполнение от потомка к предку
    - Поиск метода не по имени, а по селектору - уникальный id метода
    - Как видите, класс - это объект
  • - Итак, поговорим о рантайме
    - Выполнение от потомка к предку
    - Поиск метода не по имени, а по селектору - уникальный id метода
    - Как видите, класс - это объект
  • - Можно получить класс и вызывать методы у него, или по имени класса
  • - Фабричный метод
    - Регистриуем класс узла дерева и используем
    - isSubclassOfClass: - пример метода introspection
    - Дальше в коде создастся инстанс другого класса

Transcript

  • 1. Objective-C 2.0 Краткое описание языка и среды исполнения
  • 2. План доклада • Основные характеристики и синтаксис • Управление памятью • Отсылка сообщений • Метаинформация (Introspection) • Интеграция с C/C++
  • 3. Основыные характеристики • Надмножество языка Си • Объектно-ориентированный • Компилируемый • Среда выполнения • Нет сборщика мусора
  • 4. Пример кода 1. #import <Foundation/Foundation.h> 2. 3. @interface TreeNode : NSObject { 4. TreeNode *left; 5. TreeNode *right; 6. int value; 7. } 8. 9. @property (nonatomic, retain) TreeNode *left; 10. @property (nonatomic, retain) TreeNode *right; 11. @property (readonly) int value; 12. 13. + (id)nodeWithValue:(int)value; 14. - (id)initWithValue:(int)value; 15. - (void)traverseWithArray:(NSMutableArray *)array; 16. 17. @end
  • 5. 1. @implementation TreeNode 2. 3. @synthesize left, right, value; 4. 5. + (id)nodeWithValue:(int)value { 6. return [[[self alloc] initWithValue:value] autorelease]; 7. } 8. 9. - (id)initWithValue:(int)value { 10. if (self = [super init]) { 11. self->value = value; 12. } 13. return self; 14. } 15. 16. - (void)traverseWithArray:(NSMutableArray *)array { 17. [array addObject:[NSNumber numberWithInt:value]]; 18. [left traverseWithArray:array]; 19. [right traverseWithArray:array]; 20. } 21. 22. - (void)dealloc { 23. [left release]; 24. [right release]; 25. [super dealloc]; 26. } 27. 28. @end
  • 6. Что общего с C++ и К • Си-подобный синтаксис • Классы, методы, свойства, поля • Интерфейсы (@protocol) • Область видимости (@private, @public...) • Исключения (@throw, @try...)
  • 7. Различия: Посылка сообщения в nil 1. - (void)traverseWithArray:(NSMutableArray *)array { 2. [array addObject:[NSNumber numberWithInt:value]]; 3. [left traverseWithArray:array]; 4. [right traverseWithArray:array]; 5. } • Не приводит к ошибке • Возвращается “значение по умолчанию”
  • 8. Различия: Посылка сообщения в nil 1. - (void)traverseWithArray:(NSMutableArray *)array { 2. [array addObject:[NSNumber numberWithInt:value]]; 3. [left traverseWithArray:array]; 4. [right traverseWithArray:array]; 5. } • Не приводит к ошибке • Возвращается “значение по умолчанию”
  • 9. Различия: Categories 1. @interface TreeNode(MoreTraversal) 2. 3. - (void)inorderTraverseWithArray:(NSMutableArray *)array; 4. 5. @end 6. 7. @implementation TreeNode(MoreTraversal) 8. 9. - (void)inorderTraverseWithArray:(NSMutableArray *)array { 10. [left inorderTraverseWithArray:array]; 11. [array addObject:[NSNumber numberWithInt:value]]; 12. [right inorderTraverseWithArray:array]; 13. } 14. 15. @end
  • 10. Различия • Сообщение в nil • Categories • Нет @virtual, нет @abstract • Нет пространств имен • NSObject - “необязательный” базовый класс
  • 11. Управление памятью • Нет сборки мусора • Подсчет ссылок • Вызываемый код ответственен за освобождение памяти, кроме alloc, new, copy
  • 12. Управление памятью 1. NSArray *array = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil]; 2. NSString *descr = [array description]; 3. [descr retain]; 4. [array release]; 5. 6. // Do something with descr... 7. 8. [descr release];
  • 13. Управление памятью 1. + (id)nodeWithValue:(int)value { 2. return [[[self alloc] initWithValue:value] autorelease]; 3. } 4. 5. //... 6. 7. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 8. TreeNode *root = [TreeNode nodeWithValue:1]; 9. root.left = [TreeNode nodeWithValue:2]; 10. root.right = [TreeNode nodeWithValue:3]; 11. [pool release]; • NSAutoreleasePool для автоматического освобождения объектов
  • 14. Управление памятью 1. + (id)nodeWithValue:(int)value { 2. return [[[self alloc] initWithValue:value] autorelease]; 3. } 4. 5. //... 6. 7. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 8. TreeNode *root = [TreeNode nodeWithValue:1]; 9. root.left = [TreeNode nodeWithValue:2]; 10. root.right = [TreeNode nodeWithValue:3]; 11. [pool release]; • NSAutoreleasePool для автоматического освобождения объектов
  • 15. Отсылка сообщений 1. TreeNode *root = [TreeNode nodeWithValue:1]; 2. root.left = [TreeNode nodeWithValue:2]; 3. root.right = [TreeNode nodeWithValue:3]; 4. id array = [NSMutableArray array]; 5. [root traverseWithArray:array]; 6. NSString *descr = [array description]; • Позднее (динамическое) связывание
  • 16. Отсылка сообщений 1. TreeNode *root = [TreeNode nodeWithValue:1]; 2. root.left = [TreeNode nodeWithValue:2]; 3. root.right = [TreeNode nodeWithValue:3]; 4. id array = [NSMutableArray array]; 5. [root traverseWithArray:array]; 6. NSString *descr = [array description]; • Позднее (динамическое) связывание
  • 17. Отсылка сообщений 1. TreeNode *root = [TreeNode nodeWithValue:1]; 2. root.left = [TreeNode nodeWithValue:2]; 3. root.right = [TreeNode nodeWithValue:3]; 4. id array = [NSMutableArray array]; 5. [root unknownMethod:array]; 6. NSString *descr = [array description]; • Явное указание типа - просто помощь компилятору
  • 18. Отсылка сообщений 1. TreeNode *root = [TreeNode nodeWithValue:1]; 2. root.left = [TreeNode nodeWithValue:2]; 3. root.right = [TreeNode nodeWithValue:3]; 4. id array = [NSMutableArray array]; 5. [root unknownMethod:array]; 6. NSString *descr = [array description]; • Явное указание типа - просто помощь компилятору
  • 19. Отсылка сообщений superclass SEL -> address SEL selector = @selector(nodeWithValue:); SEL -> address • superclass SEL -> address SEL -> address Диспетчеризация во время исполнения isa • SEL - уникальный field1 field2 идентификатор метода
  • 20. Отсылка сообщений superclass SEL -> address SEL selector = @selector(nodeWithValue:); SEL -> address • superclass SEL -> address SEL -> address Диспетчеризация во время исполнения isa • SEL - уникальный field1 field2 идентификатор метода
  • 21. Отсылка сообщений superclass SEL -> address SEL selector = @selector(nodeWithValue:); SEL -> address • superclass SEL -> address SEL -> address Диспетчеризация во время исполнения isa • SEL - уникальный field1 field2 идентификатор метода
  • 22. Introspection • Класс - это метаобъект • NSObject содержит методы для получения информации о типе • Функции, начинающиеся с class_, также возвращают информацию о типе
  • 23. Introspection 1. static Class nodeClass; 2. 3. //... 4. 5. + (id)nodeWithValue:(int)value { 6. Class cls = nodeClass == nil ? self : nodeClass; 7. return [[[cls alloc] initWithValue:value] autorelease]; 8. } 9. 10. + (void)setNodeClass:(Class)cls { 11. if ([cls isSubclassOfClass:[TreeNode class]]) { 12. nodeClass = cls; 13. } 14. } 15. 16. //... 17. 18. [TreeNode setNodeClass:[RBTreeNode class]]; 19. TreeNode *root = [TreeNode nodeWithValue:1];
  • 24. Интеграция с C/C++ • Objective-C (.m) & C++ == Objective-C++ (.mm) • Можно: Использовать C/C++ код в классе Objective-C и наоборот (в теле метода, в поле класса) • Нельзя: Наследовать класс C++ от класса Objective-C и наоборот
  • 25. Прочее • Runtime Method Resolution (resolveInstanceMethod:) • Message Forwarding (forwardInvocation:) • And more...
  • 26. Литература • The Objective-C 2.0 Programming Language • Objective-C 2.0 Runtime Programming Guide • Learn Objective-C on the Mac (Apress)
  • 27. Об авторе • Андрей Козачук, Stella Systems • dev.oyster@gmail.com
  • 28. Благодарю за внимание