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

4

在10.6版本中,苹果公司新增了+[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'可能无法响应'+dataWithPropertyList:format:options:error:' 更糟糕的是,由于编译器不知道此选择器,它可能会错误地传递参数。

在SDK尚不存在的情况下,NSInvocation是否是调用新API的批准/最佳方法?

2个回答

6

如果我没记错的话,您希望使用10.6 SDK并将部署目标(MACOSX_DEPLOYMENT_TARGET)设置为10.4,以便10.5/10.6符号是弱链接的。然后您可以使用respondsToSelector:等内容而不会收到警告。

当然,请确保检查对象是否能够响应选择器,否则在10.4/10.5上会崩溃。


2
另一种做法是将缺失的方法声明为相关类别的类别。这将使编译器停止抱怨找不到该方法,尽管您仍需要运行时检查来避免实际调用该方法。您可能还希望使用可用性宏来包装这样的声明,以便在升级到使用10.5/10.6 SDK后忽略它,并且您不会在以后收到不同的编译器投诉。这将看起来像这样:
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 //ignore when compiling with the 10.5 SDK or higher
@interface NSPropertyListSerialization(MissingMethods)

+ (NSData *)dataWithPropertyList:(id)plist format:(NSPropertyListFormat)format options:(NSPropertyListWriteOptions)opt error:(NSError **)error;

@end
#endif

谢谢!最终我改变了测试为MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5(因为此调用最早出现在10.6 SDK中),并且我使用unsigned int代替NSPropertyListWriteOptions(因为该类型在10.4 SDK中未定义)。 - Jim Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接