В чем разница между динамическим связыванием и динамическим типированием в Objective C - PullRequest
14 голосов
/ 20 февраля 2012

Мне трудно понять, в чем разница между динамическим связыванием и динамическим типированием в Objective C. Может кто-нибудь объяснить это?

Ответы [ 4 ]

33 голосов
/ 20 февраля 2012

Динамическая типизация в Objective-C означает, что класс объекта типа id неизвестен во время компиляции и вместо этого обнаруживается во время выполнения, когда объекту отправляется сообщение.Например, в следующем коде класс foo неизвестен, пока мы не попытаемся отправить сообщение componentsSeparatedByString:.

id foo = @"One Two Three";
NSArray *a = [foo componentsSeparatedByString:@" "];

Если вместо использования типа данных id мы имелисделали следующее ...

NSString *foo = @"One Two Three";

... тогда мы будем использовать статическую типизацию вместо динамической типизации.

динамическое связывание означает, что компилятор не знает, какая реализация метода будет выбрана;вместо этого реализация метода ищется во время выполнения при отправке сообщения.Это в основном помогает нам с Полиморфизмом .Таким образом,

[foo description]

приводит к вызову другой реализации метода, если, например, foo является экземпляром NSArray, а не экземпляром NSString.

7 голосов
/ 20 февраля 2012

с динамической типизацией вы можете иметь переменную типа id, которая может хранить любой тип объекта. с динамическим связыванием вы можете сделать это: id obj; [obj doWhatever]; и до тех пор, пока obj относится к типу, который реализует -(void)doWhatever, он будет работать.

3 голосов
/ 20 октября 2015

Из документации 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];
0 голосов
/ 01 декабря 2016

Если вы знакомы с Javascript, динамическая типизация в цели C очень похожа на то, что есть в «var» в Javascript, где фактический тип этой переменной будет определен во время выполнения и после того, как он назначен.Его можно использовать повторно и повторно вводить столько раз, сколько вам нужно, что делает его рискованным для использования, если вы не знаете тип объекта, удерживаемого во время выполнения, так же, как вы можете это сделать с помощью исключений времени выполнения «нераспознанного селектора»,В Objective-C все объекты имеют идентификатор типа, поэтому для динамической типизации можно использовать переменную идентификатора типа.

Динамическое связывание с объектами - это «полиморфное» поведение, при котором правильный метод вызывается на основетип объекта, к которому он вызывается во время выполнения.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...