Objective-C имеет __attribute__((availability))
дольше, чем @available
. Чтобы заставить это работать, компилятор Objective C слабо связывает символы, которые не доступны в цели развертывания. Это означает, что компиляция всегда завершается успешно, и запуск вашего приложения завершается успешно, но символ будет НЕДЕЙСТВИТЕЛЕН во время выполнения, если он недоступен.
В зависимости от того, что это такое, вы получите более или менее изящную деградацию при попытке его использовать:
- вызов слабой связанной функции, которая отсутствует, может привести к сбою
- чтение или запись в глобальную переменную, которая отсутствует, может привести к сбою
- использование класса, который отсутствует, будет запретом, и все методы будут возвращать ноль
Старый способ проверки того, найден ли символ во время выполнения, заключается в сравнении его с NULL:
NS_AVAILABLE_MAC(...) @interface Foo @end
int bar NS_AVAILABLE_MAC(...);
int baz(int frob) NS_AVAILABLE_MAC(...);
if ([Foo class]) { /* Foo is available */ }
if (&bar) { /* bar is available */ }
if (&baz) { /* baz is available */ }
В вашем случае:
Reader *tmp = [[Reader alloc] init];
tmp
будет nil
, потому что это будет то же самое, что и [[nil alloc] init]
.
Директива @available
была добавлена относительно недавно в Objective-C. Теперь можно использовать @available
в Objective-C так же, как вы используете #available
в Swift. Однако, чтобы сохранить обратную совместимость, возможно, никогда не будет ошибкой времени компиляции (при уровнях ошибок по умолчанию) пытаться использовать символ, который может быть недоступен для цели развертывания в Objective-C.