Приведение объектов Objective-C - PullRequest
1 голос
/ 30 марта 2012

Мне уже давно интересно, и Google не предоставил мне нужную мне информацию. Как быстро проходит процесс литья? Зависит ли это от количества полей у объекта? Этого следует избегать любой ценой? Отличается ли он на машинах x32, x64 и ARM?

1 Ответ

6 голосов
/ 30 марта 2012

Приведение предназначено только для того, чтобы компилятор выдавал вам лучшие предупреждения.Во время исполнения кастинг не имеет производительности.Все объекты являются просто объектами.Вы отправляете сообщения этим объектам.

Среде выполнения не важно, какой тип вы указали, когда в вашем коде был указатель на этот объект.Он отправит сообщение независимо от того, что.

Например:

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);

И среда выполнения будет делать то же самое, но компилятор будет сопоставлять ваши типы по-разному и генерировать предупреждения / ошибки на основе различной семантики (в основном, любой объект говорит, что он отвечает на это сообщение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...