Является ли тип идентификатора в Objective-C действительно динамическим - PullRequest
3 голосов
/ 11 ноября 2010

Является ли тип id действительно динамическим (позднее связывание во время выполнения) или аналогично ключевому слову 'var' в C # (позднее связывание во время компиляции)?

Ответы [ 2 ]

9 голосов
/ 11 ноября 2010

С Язык программирования Objective-C :

Идентификатор определяется как указатель на структуру данных объекта:

typedef struct objc_object {
    Class isa;
} *id;

ичто еще более важно

Тип идентификатора полностью неограничен.Сам по себе он не дает никакой информации об объекте, кроме того, что это объект.В какой-то момент программе обычно требуется найти более конкретную информацию об объектах, которые она содержит.Поскольку указатель типа id не может предоставить эту информацию компилятору, каждый объект должен быть в состоянии предоставить ее во время выполнения.

Переменная isa экземпляра идентифицирует класс объекта - какой это тип объекта.Объекты с одинаковым поведением (методы) и одинаковыми типами данных (переменные экземпляра) являются членами одного и того же класса.

Таким образом, объекты динамически типизируются во время выполнения. Когда это необходимо,система времени выполнения может найти точный класс, к которому принадлежит объект, просто запросив объект.(Чтобы узнать больше о среде выполнения, см. Руководство по программированию среды выполнения Objective-C.) Динамическая типизация в Objective-C служит основой для динамического связывания, обсуждается позже.

6 голосов
/ 11 ноября 2010

Действительно динамично. На нем даже не выполняется статическая проверка типов (если вы не объявляете список протоколов для переменной). Он определяется просто как указатель на объект. Например, вы можете сделать это:

Class classes[3];
classes[0] = [NSMutableString class];
classes[1] = [NSMutableArray class];
classes[2] = [NSMutableData class];
srandom(time(NULL));
id foo = [[classes[random % 3] alloc] init];
NSLog(@"It is a %@", [foo class]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...