More Related Content Similar to Objective-C 2.0: краткое описание языка и рантайма Similar to Objective-C 2.0: краткое описание языка и рантайма (20) 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
Editor's Notes - &#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E; &#x43F;&#x440;&#x43E; &#x44F;&#x437;&#x44B;&#x43A;
- Intended audience - &#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x44B;&#x435; &#x442;&#x438;&#x43F;&#x44B; &#x438; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x438; &#x438;&#x437; &#x421;&#x438;
- &#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43A;&#x43E;&#x434;&#x430; - &#x434;&#x432;&#x43E;&#x438;&#x447;&#x43D;&#x43E;&#x435; &#x434;&#x435;&#x440;&#x435;&#x432;&#x43E; - #import, &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x432;&#x44B;&#x435; &#x441;&#x43B;&#x43E;&#x432;&#x430;
- 2 &#x447;&#x430;&#x441;&#x442;&#x438;: @interface &#x438; @implementation
- &#x41D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x442; NSObject
- &#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43F;&#x43E;&#x43B;&#x44F;
- &#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;, &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;, &#x442;&#x438;&#x43F;&#x43E;&#x432;, &#x43A;&#x430;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x432;&#x44B;&#x433;&#x43B;&#x44F;&#x434;&#x44F;&#x442; - &#x41E; @synthesise
- &#x412;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; - &#x41E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435; &#x43D;&#x430; C#/Java - &#x412; left &#x438; right &#x43D;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43D;&#x430; nil - &#x414;&#x43E;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x43C;, &#x445;&#x43E;&#x442;&#x438;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; traverse
- &#x41E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;
- &#x414;&#x430;&#x436;&#x435; &#x434;&#x43B;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x432; &#x438;&#x437; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A;&#x438;
- &#x41D;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x43E;&#x43B;&#x44F; &#x43E;&#x431;&#x44A;&#x44F;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43D;&#x435;&#x43B;&#x44C;&#x437;&#x44F; - &#x41D;&#x435;&#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; - &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x441;&#x432;&#x43E;&#x439;, &#x43D;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E; - &#x41D;&#x435; managed &#x43C;&#x438;&#x440;
- &#x415;&#x441;&#x442;&#x44C; &#x441;&#x431;&#x43E;&#x440;&#x449;&#x438;&#x43A;, &#x43D;&#x43E; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x201C;&#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x43C;&#x201D; &#x440;&#x430;&#x43D;&#x442;&#x430;&#x439;&#x43C;&#x435;
- &#x422;.&#x435;. &#x432;&#x430;&#x448; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;, &#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x435;&#x43D; &#x437;&#x430; &#x43E;&#x441;&#x432;&#x43E;&#x431;&#x43E;&#x436;&#x43D;&#x435;&#x43D;&#x438;&#x435; - &#x412;&#x44B;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x43C; &#x441;&#x430;&#x43C;&#x438;, &#x43E;&#x441;&#x432;&#x43E;&#x431;&#x43E;&#x436;&#x434;&#x430;&#x435;&#x43C; &#x441;&#x430;&#x43C;&#x438;
- descr - &#x447;&#x430;&#x441;&#x442;&#x44C; NSArray, &#x438; &#x442;&#x43E;&#x436;&#x435; &#x43E;&#x441;&#x432;&#x43E;&#x431;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F;
- retain - &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x43B;&#x441;&#x44F; - &#x41D;&#x430;&#x448; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; - autorelease
- NSAutoreleasePool. &#x41C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;
- &#x415;&#x441;&#x442;&#x44C; &#x433;&#x43B;&#x43E;&#x431;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; NSAutoreleasePool &#x432; main &#x43F;&#x43E;&#x434; iPhone - &#x41E;&#x442;&#x441;&#x44B;&#x43B;&#x43A;&#x430; &#x441;&#x43E;&#x43E;&#x431;&#x449;&#x435;&#x43D;&#x438;&#x439; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438; &#x43A;&#x43E;&#x43D;&#x446;&#x435;&#x43F;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;
- &#x41A;&#x43E;&#x434; &#x43D;&#x435; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A; &#x43A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x446;&#x438;&#x438;/&#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; (id array)
- &#x421;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x44F; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x44F; - &#x422;&#x43E;&#x442; &#x436;&#x435; &#x43A;&#x43E;&#x434;, &#x43D;&#x43E; &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43D;&#x435;&#x438;&#x437;&#x432;&#x435;&#x441;&#x442;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;
- &#x41A;&#x43E;&#x43C;&#x43F;&#x438;&#x43B;&#x44F;&#x442;&#x43E;&#x440; &#x432;&#x44B;&#x434;&#x430;&#x441;&#x442; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; warning, &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432; &#x440;&#x430;&#x43D;&#x442;&#x430;&#x439;&#x43C;&#x435; - &#x418;&#x442;&#x430;&#x43A;, &#x43F;&#x43E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x43C; &#x43E; &#x440;&#x430;&#x43D;&#x442;&#x430;&#x439;&#x43C;&#x435;
- &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x43A;&#x430; &#x43A; &#x43F;&#x440;&#x435;&#x434;&#x43A;&#x443;
- &#x41F;&#x43E;&#x438;&#x441;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43D;&#x435; &#x43F;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x438;, &#x430; &#x43F;&#x43E; &#x441;&#x435;&#x43B;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x443; - &#x443;&#x43D;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; id &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;
- &#x41A;&#x430;&#x43A; &#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x43A;&#x43B;&#x430;&#x441;&#x441; - &#x44D;&#x442;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; - &#x418;&#x442;&#x430;&#x43A;, &#x43F;&#x43E;&#x433;&#x43E;&#x432;&#x43E;&#x440;&#x438;&#x43C; &#x43E; &#x440;&#x430;&#x43D;&#x442;&#x430;&#x439;&#x43C;&#x435;
- &#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43E;&#x442; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x43A;&#x430; &#x43A; &#x43F;&#x440;&#x435;&#x434;&#x43A;&#x443;
- &#x41F;&#x43E;&#x438;&#x441;&#x43A; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43D;&#x435; &#x43F;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x438;, &#x430; &#x43F;&#x43E; &#x441;&#x435;&#x43B;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x443; - &#x443;&#x43D;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; id &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;
- &#x41A;&#x430;&#x43A; &#x432;&#x438;&#x434;&#x438;&#x442;&#x435;, &#x43A;&#x43B;&#x430;&#x441;&#x441; - &#x44D;&#x442;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; - &#x41C;&#x43E;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x438; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x443; &#x43D;&#x435;&#x433;&#x43E;, &#x438;&#x43B;&#x438; &#x43F;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430; - &#x424;&#x430;&#x431;&#x440;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434;
- &#x420;&#x435;&#x433;&#x438;&#x441;&#x442;&#x440;&#x438;&#x443;&#x435;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x443;&#x437;&#x43B;&#x430; &#x434;&#x435;&#x440;&#x435;&#x432;&#x430; &#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;
- isSubclassOfClass: - &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; introspection
- &#x414;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x432; &#x43A;&#x43E;&#x434;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x441;&#x442;&#x441;&#x44F; &#x438;&#x43D;&#x441;&#x442;&#x430;&#x43D;&#x441; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;