2010-06-10 24 views
1

在iPhone SDK 3.2中,[CLLocation getDistanceFrom:]已更名爲[CLLocation distanceFromLocation:]。我的項目使用3.2作爲Base SDK和3.0的「部署目標」進行編譯,這意味着僅在3.2中可用的框架是弱鏈接的,所以我的應用程序仍然可以在3.0上運行。在Cocoa Touch中使用「部署目標」和弱鏈接重命名方法

如果我將呼叫更改爲使用新名稱distanceFromLocation:,運行3.0或3.1的設備上會發生什麼情況? I 假設該方法調用將失敗並且將返回0.0(因爲Cocoa返回無法識別的選擇器的默認值)。

如果我的假設是正確的,這意味着我現在必須忍受編譯器警告,直到我不再想要定位3.0。

回答

3

如果我將呼叫更改爲使用新名稱distanceFromLocation :,運行3.0或3.1的設備上會發生什麼情況?我認爲方法調用將失敗,並且將返回0.0(因爲Cocoa返回無法識別的選擇器的默認值)。

不,你正在考慮發送消息到nil。將消息發送給不能識別選擇器的對象將導致異常。如果您沒有發現該異常,您的應用程序將崩潰。用戶不會喜歡這一點,蘋果可能會拒絕你的應用程序。

的解決方案是,以測試該位置是否響應新的選擇:

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

順便說一下,這真的沒有什麼關係聯繫起來。如果我們談論的是改變名稱的類,那麼它就是,但動態消息調度意味着Objective-C「方法調用」(更確切地說,消息到對象)不會在編譯或鏈接時綁定。

+0

謝謝彼得,你們兩個都對。 – 2010-06-11 13:14:41