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

时间:2009-11-18 02:34:46

标签: 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:'更糟糕的是,由于编译器不知道这个选择器,它可能会错误地传递参数。

对于新的API,NSInvocation是否已被批准/最好的方式,就SDK而言,还不存在?

2 个答案:

答案 0 :(得分:6)

IIRC,您希望使用10.6 SDK并将部署目标(MACOSX_DEPLOYMENT_TARGET)设置为10.4,因此10.5 / 10.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