Переименованные методы с «целью развертывания» и слабым связыванием в Cocoa Touch - PullRequest
1 голос
/ 10 июня 2010

В iPhone SDK 3.2 [CLLocation getDistanceFrom:] было переименовано в [CLLocation distanceFromLocation:]. Мой проект скомпилирован с 3.2 в качестве базового SDK и «цели развертывания» 3.0, что означает, что платформы, доступные только в 3.2, слабо связаны, поэтому мое приложение все еще может работать на 3.0.

Если я изменю свои звонки на новое имя distanceFromLocation:, что произойдет на устройствах с 3.0 или 3.1? Я предполагаю , что вызов метода завершится неудачно и будет возвращено 0.0 (поскольку Cocoa возвращает значение по умолчанию для нераспознанных селекторов).

Если мои предположения верны, это означает, что мне придется жить с предупреждениями компилятора, пока я не перестану ориентироваться на 3.0.

1 Ответ

3 голосов
/ 11 июня 2010

Если я изменю свои звонки на новое имя 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 (точнее, сообщения объектам) не связаны во время компиляции или соединения.

...