Динамический контроль типов
Переменная с динамическим контролем типов, когда тип объекта, на который это указывает, не проверяется во время компиляции. 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]); |
} |
Объект, на который указывает переменная во время выполнения, должен быть в состоянии реагировать безотносительно сообщений Вы отправляете к нему; иначе, Ваша программа выдает исключение. Фактическая реализация вызванного метода определяется с помощью динамического связывания.
isa Указатель
Каждый объект имеет isa
переменная экземпляра, идентифицирующая класс объекта. Время выполнения использует этот указатель для определения фактического класса объекта, когда это должно.