Objective-C 2.0: краткое описание языка и рантайма
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • 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
3,872
On Slideshare
3,429
From Embeds
443
Number of Embeds
5

Actions

Shares
Downloads
23
Comments
0
Likes
1

Embeds 443

http://www.iphonedev.com.ua 367
http://iphonedevcamp.com.ua 50
http://www.slideshare.net 14
http://feeds2.feedburner.com 11
http://feeds.feedburner.com 1

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
  • - &#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443; &#x440;&#x430;&#x441;&#x441;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x44E; &#x43F;&#x440;&#x43E; &#x44F;&#x437;&#x44B;&#x43A; <br /> - 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; <br /> - &#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; <br /> - 2 &#x447;&#x430;&#x441;&#x442;&#x438;: @interface &#x438; @implementation <br /> - &#x41D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x442; NSObject <br /> - &#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43F;&#x43E;&#x43B;&#x44F; <br /> - &#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 <br /> - &#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 <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - descr - &#x447;&#x430;&#x441;&#x442;&#x44C; NSArray, &#x438; &#x442;&#x43E;&#x436;&#x435; &#x43E;&#x441;&#x432;&#x43E;&#x431;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; <br /> - 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 <br /> - NSAutoreleasePool. &#x41C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x43C; <br /> - &#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; <br /> - &#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) <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - &#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; <br /> - isSubclassOfClass: - &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; introspection <br /> - &#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;

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. Благодарю за внимание