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

Как Objective-C обеспечивает динамическое время выполнения?

Как Objective-C обеспечивает "динамическое" время выполнения? Что здесь означает "динамический"?

4b9b3361

Ответ 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 являются динамическими.