Переименованные методы с «Целью развертывания» и слабым связей в какао

StackOverflow https://stackoverflow.com/questions/3015453

  •  26-09-2019
  •  | 
  •  

Вопрос

На 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.

Это было полезно?

Решение

Если я изменим мои звонки, чтобы использовать новое имя расстояния расстояния :, Что произойдет на устройствах работает 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];

Кстати, это на самом деле не имеет ничего общего с связыванием. Если бы мы говорили о классе, который изменил имена, то это было бы, но динамическое сообщение для отправки средств означает объектив-C «Способ вызовов» (точнее, сообщения на объекты) не связаны при компиляции или времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top