在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:'
更糟糕的是,由于编译器不知道这个选择器,它可能会错误地传递参数。
对于新的API,NSInvocation是否已被批准/最好的方式,就SDK而言,还不存在?
答案 0 :(得分:6)
respondsToSelector:
内容而不会收到警告。
当然,确保您正在检查对象是否可以响应选择器,否则您将在10.4 / 10.5上崩溃。
答案 1 :(得分: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