Приведение предназначено только для того, чтобы компилятор выдавал вам лучшие предупреждения.Во время исполнения кастинг не имеет производительности.Все объекты являются просто объектами.Вы отправляете сообщения этим объектам.
Среде выполнения не важно, какой тип вы указали, когда в вашем коде был указатель на этот объект.Он отправит сообщение независимо от того, что.
Например:
NSArray *myString = [NSString stringWithFormat:@"Hello"];
NSNumber *longerString = [(NSString *)myString stringByAppendingString:@" World"];
NSLog(@"%@", longerString);
Будет протоколировать Hello World
.Вы действительно присваиваете типы вещам, чтобы компилятор мог проверить, но среда выполнения знает только, что вы передаете сообщение объекту.Он будет использовать класс объекта для поиска метода, вызываемого по имени сообщения, но ему все равно, что вы ввели во время компиляции.
Вы могли бы также сделать:
id myString = [NSString stringWithFormat:@"Hello"];
id longerString = [myString stringByAppendingString:@" World"];
NSLog(@"%@", longerString);
И среда выполнения будет делать то же самое, но компилятор будет сопоставлять ваши типы по-разному и генерировать предупреждения / ошибки на основе различной семантики (в основном, любой объект говорит, что он отвечает на это сообщение).