1

在 iPhone SDK 3.2 中,[CLLocation getDistanceFrom:]被重命名为[CLLocation distanceFromLocation:]. 我的项目是使用 3.2 作为 Base SDK 和 3.0 的“部署目标”编译的,这意味着仅在 3.2 中可用的框架是弱链接的,因此我的应用程序仍然可以在 3.0 上运行。

如果我将呼叫更改为使用新名称distanceFromLocation:,运行 3.0 或 3.1 的设备会发生什么情况?我假设方法调用将失败并被0.0返回(因为 Cocoa 为无法识别的选择器返回默认值)。

如果我的假设是正确的,这意味着我现在必须忍受编译器警告,直到我不再想以 3.0 为目标。

4

1 回答 1

3

如果我将呼叫更改为使用新名称 distanceFromLocation:,运行 3.0 或 3.1 的设备会发生什么情况?我假设方法调用将失败并返回 0.0 (因为 Cocoa 为无法识别的选择器返回默认值)。

不,您正在考虑向nil. 向无法识别选择器的对象发送消息将导致异常。如果您没有捕获该异常,您的应用程序将崩溃。用户不会喜欢这样,Apple 可能会拒绝你的应用程序。

解决方法是测试位置是否响应新的选择器:

if ([here respondsToSelector:@selector(distanceFromLocation:)])
    distance = [here distanceFromLocation:there];
else if ([here respondsToSelector:@selector(getDistanceFrom:)])
    distance = [here getDistanceFrom:there];

顺便说一句,这实际上与链接没有任何关系。如果我们谈论的是一个已更改名称的类,那么它会是,但是动态消息分发意味着 Objective-C 的“方法调用”(更准确地说,是对对象的消息)在编译或链接时没有绑定。

于 2010-06-11T08:33:40.120 回答