Если вы считаете, что любая форма «путаницы» компилятора является неверным решением, вам, вероятно, придется смириться с предупреждением. (В моей книге, если вы спрашиваете, как избавиться от предупреждения, неразумно смотреть дареному коню в рот и говорить, что что-то недопустимо только потому, что это не выглядит так, как вы ожидаете.)
Ответы, которые работают во время выполнения, включают маскирование операции, которая происходит с динамической диспетчеризацией, чтобы компилятор не жаловался на устаревший вызов. Если вам не нравится такой подход, вы можете отключить «Предупреждать об устаревших функциях» в вашем проекте Xcode или в настройках цели, но это, как правило, плохая идея. Вы хотите знать об устаревших API, но в этом случае вы хотите использовать его без предупреждения. Существуют простые и трудные способы сделать это, и есть вероятность, что вы в любой форме сочтете их всех «недействительными», но это не мешает им быть эффективными, даже правильными. ; -)
Один из возможных способов избежать предупреждений, которые все еще выбираются во время выполнения, - это использовать objc_msgSend()
напрямую:
objc_msgSend(fileManager, @selector(removeFileAtPath:error:), downloadDir, nil];
Это то, что среда выполнения Objective C делает под прикрытием в любом случае , и должна достичь желаемого результата с минимумом суеты. Вы можете даже оставить исходную строку с комментариями над ней для ясности. Я знаю, что в документации написано: «Компилятор генерирует вызовы для функции обмена сообщениями. Никогда не вызывайте ее напрямую в коде, который вы пишете». Вы сами должны решить, когда можно нарушать правила.