2012-11-25 34 views
4

Objective-C支持子類化和類別,允許您將方法添加到現有類中。這是我的情況。Objective-C子類化和將來的兼容性

// Made at earlier than iOS 5.x 
@interface MyVC : UIViewController 
- (void)childViewControllers; 
@end 

在iOS 5.0之前沒有childViewControllers方法。我可以毫無顧慮地添加該方法。但現在UIViewController有一個名字的方法。如果我構建爲iOS 4.x編寫的遺留代碼,則該方法將被覆蓋,並且會產生不可預知的結果。

是否有任何技術來防禦這類問題的代碼?這可以發生在類別或(可能)其他東西。

+0

你可以檢查是否UIViewController中實現它,如果這樣稱呼超級 – DanZimm

+1

我就主要講述名稱衝突......甚至,該方法具有相同的名稱,它的功能可以完全不同。 – Eonil

+0

啊疑難雜症,我是假設的方法會做同樣的事情 – DanZimm

回答

6

一個選項是爲所有方法名稱添加前綴。無論何時你擴展一個標準的框架類。

由於在Java中沒有名稱空間,因此對類名使用相同的技術以避免未來可能發生的衝突。

這是另一個需要考慮的問題。發生這種情況的頻率如何?您需要重新評估處理罕見名稱衝突的工作,方法是重新命名您的方法並更新受影響的代碼,而不必重複提供前綴命名方案,並且每天都要反覆輸入這些額外的字符。

+3

(+1)也[私有方法]參見(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles /NamingMethods.html#//apple_ref/doc/uid/20001282-1003829)在「Cocoa的編碼指南」中對於Apple的建議何時使用前綴。 –

+1

我真的很想避免輸入多餘的字母和醜陋的下劃線,但我的觀點是沒有正確的美麗是程序的關鍵缺陷。無論如何,看起來沒有什麼可以保護我免受這種未來的名稱衝突。 – Eonil

1

在處理像Obj-C這樣的後期綁定系統時,必須對命名衝突保持警惕。

不幸的是,這意味着你總是處於這種問題的風險之中。在這種情況下,你在4.x天沒有做錯任何事。你所做的只是爲一個好主意寫一個好名字!但蘋果也喜歡這個名字,他們的東西每次都會優先考慮。你最好的選擇是給你的類和方法名添加一個前綴,特別是在擴展Apple的東西時。

在這種情況下,只需重命名您的方法。好消息是,在移動世界中,您不需要修補舊的應用版本,同時維護新的應用版本。隨時在市場上購買單一版本的應用程序是合法的。這意味着您可以對代碼庫進行永久更改,而無需擔心將更改保持在應用程序的v5.1.6中,但不適用於v6.0.2。當用戶更新時,他們總是更新到最新版本。

你會積累經驗硬盤的方式(你現在做的),像我一樣,當我有叫description一個非常重要的方法。