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