objective-c - 如何有条件地使用新的 Cocoa API

标签 objective-c cocoa

在 10.6 中,Apple 添加了 +[NSPropertyListSerialization dataWithPropertyList:format:options:error:] 并将旧的 +[NSPropertyListSerialization dataFromPropertyList:format:errorDescription:] 标记为过时和很快就会被弃用。在 10.6 及更高版本上使用较新的调用并仍然在较早的操作系统版本上运行的一种方法是这样的:

if ([NSPropertyListSerialization respondsToSelector:@selector(dataWithPropertyList:format:options:error:)]) {
    data = [NSPropertyListSerialization dataWithPropertyList:dict
                                                      format:NSPropertyListXMLFormat_v1_0
                                                     options:0
                                                       error:&err];
} else {
    data = [NSPropertyListSerialization dataFromPropertyList:dict
                                                      format:NSPropertyListXMLFormat_v1_0
                                            errorDescription:&errorDescription];        
}

针对 10.4 SDK(为了与该版本兼容)构建,这会导致:warning: 'NSPropertyListSerialization' may not respond to '+dataWithPropertyList:format:options:error:' 更糟的是,因为编译器不知道这个选择器,它可能会错误地传递参数。

NSInvocation 是否是调用就 SDK 而言尚不存在的新 API 的认可/最佳方式?

最佳答案

IIRC,您想使用 10.6 SDK 并将部署目标 (MACOSX_DEPLOYMENT_TARGET) 设置为 10.4,因此 10.5/10.6 符号是弱链接的。然后你可以使用 respondsToSelector: 东西而不是得到警告。

当然,请确保您正在检查对象是否可以响应选择器,否则您将在 10.4/10.5 上崩溃。

关于objective-c - 如何有条件地使用新的 Cocoa API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1753263/

相关文章:

ios - 包含数组对象的字典在将其传递给 WatchKit 扩展时崩溃

ios - 从数组数据自定义 UiTableView

objective-c - 创建 NSWindow 的问题

objective-c - 如何更改 "System Preferences > Keyboard > Modifier Keys..."中的修改键

objective-c - TableView 中的 QLPreviewPanel 存在问题 : "has no controller"

ios - 如何正确使用 UITableViewCell 和 UITableViewCellStyle 以及单元格重用?

objective-c - 在 cocoa 的 web View 中右键单击时重命名默认上下文菜单标题 [ Objective-C ]

ios - 以编程方式向 UITabBarController 添加/删除选项卡会发出控制台警告

objective-c - 你可以手动实现 Cocoa 绑定(bind)吗?

objective-c - NSWindow 示例