我剛開始開發iPhone和我在學習Objective-C的過程。我已經看到一些代碼,在類的這樣的@implementation側實現的方法:Objective-C的方法實現細微的差別
-(void)myMethod; {
// method body
}
是什麼讓這個有趣的是,有在@interface爲類沒有myMethod的提及。我嘗試了一個示例項目,當我編譯時,我從XCode得到一個警告,myMethod可能不會被調用代碼看到。
誰能告訴我是怎麼回事?
謝謝!
我剛開始開發iPhone和我在學習Objective-C的過程。我已經看到一些代碼,在類的這樣的@implementation側實現的方法:Objective-C的方法實現細微的差別
-(void)myMethod; {
// method body
}
是什麼讓這個有趣的是,有在@interface爲類沒有myMethod的提及。我嘗試了一個示例項目,當我編譯時,我從XCode得到一個警告,myMethod可能不會被調用代碼看到。
誰能告訴我是怎麼回事?
謝謝!
在ObjC,方法調用動態解析(dynamic binding),這意味着,當你做[obj myMethod];
,內部的ObjC運行系統軟件將通過該點的類方法及時,如果找到一個叫「myMethod的」它會然後調用它。
另外有可能的方法在運行時添加的對象。
在@interface
節中的方法聲明只是在那裏幫助編譯器確定哪些方法是公開的給定類。如果您只在@implementation
中添加方法,編譯器可能會提醒您,但代碼仍然可以編譯和工作。
我有時用這個內部方法添加到我的對象,這些對象只能從其他方法後,從來沒有從外面叫。雖然我不記得看到有關它的警告......確保將調用代碼放在之後方法在同一個文件中執行。
這就像在C.你不需要聲明函數(即它不必是在@interface
),但如果前沒有聲明,任何代碼方法定義將生成警告。代碼後方法定義不會產生警告。
它可能是導致警告的方法名稱之後的分號。在編寫單元測試類時,我總是忽略@interface中的聲明,我從來沒有看到這樣的警告。 – JeremyP 2010-05-24 08:38:42
@JeremyP Nope,分號是合法的。事實上,當你從'@interface'將它們複製粘貼並返回時,你不必編輯方法頭部。 – hamstergene 2012-02-09 09:00:22