Подтвердить что ты не робот

В чем разница между динамической привязкой и динамической типизацией в Objective C

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

4b9b3361

Ответ 1

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

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

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

NSString *foo = @"One Two Three";

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

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

[foo description]

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

Ответ 2

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

Ответ 3

Из документации 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], определяется во время выполнения. Система времени выполнения использует селектор для запуска метода для определения соответствующего метода независимо от того, каким будет класс класса aObject.

 NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];
[anObject run];

Ответ 4

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

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

Я надеюсь, что это поможет