Если я изменю свои звонки на новое имя distanceFromLocation: что произойдет на устройствах с 3.0 или 3.1? Я предполагаю, что вызов метода завершится ошибкой и будет возвращено 0.0 (поскольку Cocoa возвращает значение по умолчанию для нераспознанных селекторов).
Нет, вы думаете об отправке сообщений на nil
. Отправка сообщения объекту, который не распознает селектор, вызовет исключение. Если вы не поймете это исключение, ваше приложение будет аварийно завершено. Пользователям это не понравится, и Apple может отклонить ваше приложение из-за него.
Решение состоит в том, чтобы проверить, реагирует ли местоположение на новый селектор:
if ([here respondsToSelector:@selector(distanceFromLocation:)])
distance = [here distanceFromLocation:there];
else if ([here respondsToSelector:@selector(getDistanceFrom:)])
distance = [here getDistanceFrom:there];
Между прочим, это действительно не имеет ничего общего со связыванием. Если бы мы говорили о классе, который изменил имена, то это было бы так, но динамическая отправка сообщений означает, что «вызовы» метода Objective-C (точнее, сообщения объектам) не связаны во время компиляции или соединения.