Как Objective-C обеспечивает "динамическое" время выполнения? Что здесь означает "динамический"?
Как Objective-C обеспечивает динамическое время выполнения?
Ответ 1
В одном предложении: Objective-C решает, какую реализацию метода нужно вызвать прямо перед этим (во время выполнения). Идея состоит в том, что связь между именем метода и реализацией является динамической. С++, например, делает это во время компиляции.
Пример:
id object = @"1";
int i = [object intValue];
object = @1;
i = [object intValue];
В этом примере сообщение intValue
сначала отправляется в экземпляр NSString
, а затем в NSNumber
. Код, испускаемый компилятором, идентичен для обоих вызовов - на самом деле компилятор даже не знает, к какому объекту он отправляет сообщения (поскольку тип id
).
Время выполнения решает, какую реализацию вызывать, чтобы извлечь значение int из строки или NSNumber
.
Ответ 2
Динамический термин ссылается на привязку к виртуальным таблицам. Также известный как поздняя привязка, если привязка происходит во время компиляции, тогда не важно, что такое реальный объект, который получает сообщение, но важным является тип ссылки к этому объекту. С более поздним связыванием важным является объект (и лично я предпочитаю позднюю привязку), поэтому, когда вы переопределяете метод, это будет вызывать, если объект принадлежит этому классу. Рассмотрим этот класс:
@interface Person : NSObject
@end
#import "Person.h"
@implementation Person
- (NSString*) description
{
return @"A good person, smart but lazy";
}
@end
Если вы попытаетесь зарегистрировать описание:
NSObject* obj=[[Person alloc]init];
NSLog(@"%@",obj); // same as NSLog(@"%@",[obj description]);
Этот журнал "Хороший человек, умный, но ленивый". Если привязка к виртуальной таблице была статической, то был использован метод описания суперкласса NSObject, поэтому вы могли бы видеть только адрес объекта между фигурными скобками:
<Person: 0x1001083b0> // Address of the object
В С++ существует статическая привязка, очень раздражающая мое личное мнение. Ява и Objective-C являются динамическими.