处理 iOS/macOS 弃用的现代方法

Modern way to deal with deprecations on iOS/macOS

如何在可用性宏中抑制弃用警告?我知道可用性是检查新 API 的好方法,但我正在努力如何抑制弃用警告。除了下面提到的那些之外,我还有什么选择? (1.pragma 2.performSelector)

MyModel *model;
if (@available(macOS 10.13, *)) {
    NSError *error;
    model = [NSKeyedUnarchiver unarchivedObjectOfClass:[MyModel class] fromData:metadata error:&error];
    if (error) {
        [[NSAlert alertWithError:error] runModal];
    }
} else {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"

    model = [NSKeyedUnarchiver unarchiveObjectWithData:metadata];

#pragma clang diagnostic pop
}

或者用于抑制警告

if ([NSKeyedUnarchiver respondsToSelector:@selector(unarchiveObjectWithData:)]) {
    model = [NSKeyedUnarchiver performSelector:@selector(unarchiveObjectWithData:) withObject:metadata];
}

如果您使用的 API 在您的目标的部署目标或之前被弃用,您将只会收到弃用警告。

NSKeyedUnarchiver unarchiveObjectWithData 自 macOS 10.14 起已弃用。如果目标的部署目标是 macOS 10.14 或更高版本,您只会收到弃用警告。但是您发布的代码暗示您希望支持 macOS 10.12 或更早版本。

NSKeyedUnarchiver unarchivedObjectOfClass:fromData:error: 已在 macOS 10.13 中添加。

如果您真的只需要 macOS 10.13 或更高版本的部署目标,则不需要 if (@available(macOS 10.13, *))else。只需使用新的 API 即可完成。

您问题中的代码(减去编译指示)仅应在您想要支持 macOS 10.12 或更早版本时使用。然后你的目标的 Deployment Target 需要设置为 macOS 10.12 或更早版本。在这种情况下,您不需要编译指示,也不会收到任何弃用警告。