2012-07-13 61 views
0

問題在標題中。代碼示例:Objective-C - 如何隱藏實現協議的類的方法

UIViewController <MyProtocol> *viewcontroller = ...; 

[viewcontroller methodFromProtocol]; // I expect to be able to call all methods that the protocol defines 

//UIViewControllerSubclass implements MyProtocol 

UIViewControllerSubclass *viewControllerSubclassWithoutMyProtocol = [[UIViewControllerSubclass alloc] init]; 
[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere]; // I only expect to be able to call the methods that are defined in this class' interface even though this class implements MyProtocol 

回答

2

您的問題還不完全清楚,但我認爲您問您是否可以「私下」遵守協議?

這可以通過聲明您符合實現文件內的協議而不是接口文件來完成。隨着視圖控制器,你可以在自動爲您在.m文件生成的類繼續做到這一點,否則你將需要添加類延續自己:

@interface MyVCSubclass() <MyProtocol> 

現在,任何類進口只有頭文件不會知道你的控制器符合協議。

+0

感謝這似乎做了工作的「部分」:)現在,如果我只想要協議定義的一些methodos只能從實現協議的類內部訪問並且不在類之外顯示。這可能嗎? – 2012-07-13 14:36:10

+0

定義「可見」?關於爲什麼這類事情不經常完成的信息,請參閱Amy Worral的出色答案。你想達到什麼目的? – jrturton 2012-07-13 14:42:54

+0

如果我嘗試在沒有「」的情況下訪問該類,則可以看到Xcode不會顯示協議方法的自動完成。我想要實現的是讓一些類實現協議方法,我希望我的所有類都可以在最低限度上實現。然後這些類實現的這些方法中的一些只能從類本身調用。換句話說,我想要實現與在接口中聲明「public」方法相同的功能,然後在實現中聲明僅在此類中使用的方法。 – 2012-07-13 14:47:40

2

[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere];

我只希望能夠調用這個類的接口中定義的方法,即使這個類實現MyProtocol

這是一個不好的預期。 Objective-C允許你調用對象實現的任何方法。如果你試圖調用一個對象沒有實現的方法,兩件事情應該發生:

  • 你得到一個編譯器警告(雖然不是一個錯誤)
  • 當代碼運行時,它崩潰,除非你已採取措施處理此類事件。

如果一個類實現一個協議,但沒有聲明它在一個公共頭中這樣做,那麼你仍然可以調用該方法(因爲Objective C沒有私有方法)。我一直以爲你會得到一個編譯器警告,但如果你是從與你的對象相同的Xcode項目中的文件調用它(也就是說,你沒有建立一個靜態庫),那麼Xcode可能是變得聰明,並決定,因爲該方法存在,它必須可以打電話。

從您的問題中不清楚您預期會發生什麼以及發生了什麼。如果您提供這些信息,我們將能夠提供更好的答案。

+0

我期待Xcode不會在自動完成中顯示'methodThatIsNotInTheInfacefaceIsDisplayedHere'。 – 2012-07-13 13:17:58