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

Jim*_*ews 4 cocoa objective-c

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

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];        
}
Run Code Online (Sandbox Code Playgroud)

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

NSInvocation是调用新API的已批准/最佳方式,就SDK而言,它还不存在吗?

Wev*_*vah 6

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

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