Из документации Apple
Динамическая типизация
Переменная динамически вводится, когда тип объекта, на который она указывает, не проверяется привремя компиляции.Objective-C использует тип данных id для представления переменной, которая является объектом, без указания типа объекта.Это называется динамической типизацией.
Динамическая типизация отличается от статической типизации, в которой система явно идентифицирует класс, к которому принадлежит объект во время компиляции.Проверка статического типа во время компиляции может обеспечить более строгую целостность данных, но в обмен на эту целостность динамическая типизация дает вашей программе гораздо большую гибкость .А с помощью самоанализа объекта (например, запрашивая у анонимного объекта с динамической типизацией, каков его класс) вы все еще можете проверить тип объекта во время выполнения и, таким образом, проверить его пригодность для конкретной операции.
Пример иллюстрирует динамическую типизацию с использованием разнородной коллекции объектов:
NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil];
NSInteger index;
for (index = 0; index < 3; index++) {
id anObject = [anArray objectAtIndex:index];
NSLog(@"Object at index %d is %@", index, [anObject description]);
}
Объект, на который указывает переменная во время выполнения, должен иметь возможность отвечать на любые сообщения, которые вы ему отправляете;в противном случае ваша программа выдает исключение.Фактическая реализация вызванного метода определяется с использованием динамического связывания.
Динамическое связывание
Динамическое связывание определяет способ вызова во время выполнения вместо этогово время компиляции.Динамическое связывание также называется поздним связыванием.В Objective-C все методы разрешаются динамически во время выполнения.Точный исполняемый код определяется как именем метода (селектором), так и принимающим объектом.
Динамическое связывание включает полиморфизм.Например, рассмотрим коллекцию объектов, включая Dog, Athlete и ComputerSimulation.Каждый объект имеет свою собственную реализацию метода run.В следующем фрагменте кода фактический код, который должен выполняться выражением [anObject run], определяется во время выполнения.Во время выполнения система использует селектор для запуска метода, чтобы определить соответствующий метод в любом классе anObject.
NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];
[anObject run];