2012-07-27 45 views
6

我使用iOS6的Beta 3的Xcode現在生成一個空的類別。爲什麼?

當我創建一個UIViewContoller的一個新的子類(沒有其他的父類產生這種行爲,我已經注意到)注意到了這一點,同時,.m文件現在已經在頂部的空範疇的文件。過去,在瞭解類別時,我注意到有些人會使用這種相同的技術來表示私有方法(儘管不是真正的私有方法)。

這是什麼意圖在這裏?現在有什麼變化讓事物變得私密了嗎?我注意到@private指令也在那裏。

你的私人變量和方法的編碼風格是什麼?

更新:由於XCode推動我們使用類擴展,我繼續前進,並將它們用於此項目的私有方法/ ivar。但我發現了一個缺點。我看到我可以重用我的一個子類UIViewControllers以及它的所有UIButtons,UILabels等....我有這樣的繼承: UIViewController < - FirstViewController < - SecondViewController。

那麼,當我在SecondViewController中編寫代碼時,我放入FirstViewController類擴展中的所有私有方法都不會在自動完成中彈出。輕微的煩惱....

+0

Rob的回覆很好,但是......有沒有人知道爲什麼XCode只爲UIViewController的子類生成這個,而不是所有的類? (它可能爲其他人做,但我延伸的通常類不顯示此行爲。) – VaporwareWolf 2012-07-27 00:48:57

回答

19

你指的是這個接口定義:

@interface MYViewController() 
@end 

這在技術上是一個類擴展,而不是一個類別。類別在括號內有一個字符串。類擴展在編譯時被添加到類中,因此可以添加ivars(通常以屬性的形式)。類別在運行時添加,不能添加ivars。

所有這一切,你的觀點是正確的。這用於定義私有方法和屬性。

在ObjC世界裏,「私人」是一個「沒有侵入」的標誌,而不是一根剃鬚刀牆。雖然有一個@private關鍵字(它增加了編譯器強制執行),但它僅適用於ivars,通常不是必需的。這種基於警告的隱私在ObjC中運行得非常好,而且足夠了。

把你的私有屬性放在這個類的擴展名中,如果外部調用者試圖訪問它們(就像調用任何未定義的方法一樣),它們將得到「可能不響應選擇器」警告。你永遠不應該允許警告存在於ObjC項目中,所以這會強制數據封裝。


編輯

如果它們是私有的,那麼他們不應該在你的子類彈出。你想要的是被保護的。對於ObjC中的受保護方法沒有很好的方案,但常用的技巧是將它們放入類似於.h文件的類中,如MYViewController + Protected.h。我發現這在實踐中很少出現,因爲很多好的ObjC設計都沒有進行子類化。它使用組合和委託代替。

關於「爲什麼只查看控制器」。首先,它不只是視圖控制器。這只是iOS上的視圖控制器(以及VC,TableViewController和GLKViewController)。在Mac上,它也是窗口控制器和聚光燈導入器。查看:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates 
.../Library/Xcode/Templates 

但爲什麼呢?那麼,這些都是控制器,而對於需要私有屬性的控制器來說,這是非常常見的。事實上,如果你在控制器中沒有私人財產,你可能會公開太多。這不像模型和視圖類那樣普遍。我懷疑這起到了他們的決定。也可能是不同的人擁有模板,或者他們在不同的時間更新。有時你會發現一點點不一致,隨着時間的推移會變得平滑。

您也可以製作自己的模板。見Creating Custom Xcode 4 File Templates

+0

完美答案。謝謝! – VaporwareWolf 2012-07-27 00:43:13

+0

@HCHogan如果回答了您的問題,請將其標記爲答案(帖子左側的複選標記)。謝謝。 – Stunner 2012-07-28 04:14:44

相關問題