2011-03-13 64 views
9

目標-c中私有方法的最佳實踐方法是什麼?這是一種只會被用作輔助方法的方法。objective-c私有與公共方法和聲明在頭還是不是?

特別是什麼我不明白的是:

  1. 是否有需要在頭文件作爲民營指定在所有的方法?也就是說爲什麼不把它從頭文件中刪除,並且
  2. 如果你不能將它從頭文件中刪除,那麼擁有私有方法有什麼意義?
  3. 或者是在objective-c中的情況下,沒有真正的私有方法這樣的事情,在這種情況下,只需指定頭文件中的所有內容並且根本不打擾私有方法?

感謝

+1

只要記住,沒有這樣的事情作爲'私人'的方法,只要它不能從其他類調用。把它放在一個類別中*模糊了方法的存在,但是如果你的類實現了一個方法,它就會對它做出響應。 – 2011-03-14 00:04:25

+0

哦......好的......大多數人仍然懶得試圖將它們標記爲私密,或者只是讓它們公開並將它們列在*中。h文件以及真實的公共方法 – Greg 2011-03-14 00:17:11

+0

如果要爲用戶提供明確的界面,則不應在標題中列出不希望它們使用的方法。但是,如果你沒有在類擴展中聲明它們(請參閱我的答案),那麼將會失去編譯器時間語法檢查的所有優點。失語症的答案很好,但這是「C」的做事方式。類擴展是實現這一點的新「Objective C」方式。 – DougW 2011-03-14 21:58:21

回答

7

沒有必要指定在公共頭文件的方法。如果模塊中的類應該是「朋友」,您可能需要一個「私人」頭文件供模塊中的其他類使用。你甚至可以擁有一個「受保護」的頭文件,例如Apple用UIGestureRecognizerSubclass.h做的那樣。儘管這只是慣例,但語言本身並沒有任何支持。

Objective-C中的私有方法只是一個沒有公開記錄的方法;任何方法仍然可以從任何地方調用,只要調用者知道它的名稱以創建適當的選擇器。不公開記錄方法的優點是您可以自由地更改或刪除它,而不必擔心向後兼容性。將它們排除在頭文件之外是不公開記錄它們的一種方法。

+1

與您的答案沒有任何爭議 - 這在技術上是正確的。然而,簡單地省略一箇舊的C方式做事情的聲明。使用類擴展來在實現文件中聲明你的方法實際上是在Objective C 2.0中管理這個新的最佳實踐。只是想確保人們閱讀這篇文章。乾杯。 – DougW 2011-03-14 22:03:04

6

你可能想使用被稱爲「類擴展」是什麼。它們看起來相似,但不應該與類別混淆。這將允許您在.m文件中聲明私有方法,並且您將獲得所有良好的IDE更正和建議。

Here's a decent article on it
And a related SO question

+0

這些似乎沒有涵蓋在「實施」/ *。m文件中實施方法並在其中使用它的選項 - 這樣做有什麼問題嗎? – Greg 2011-03-14 00:16:17

+0

@Greg:沒有什麼比用C定義一個函數沒有更多的錯誤,而沒有先聲明它的位置。源文件中也有同樣的警告WTF順序等等。 – Anomie 2011-03-14 00:22:35

+0

@Greg這也會起作用,只是意識到你有訂單問題。例如,如果實現在源代碼中的使用之後,您仍然會收到警告。在內部使用擴展可以讓您輕鬆一站式查看實施清單。 – bbum 2011-03-14 02:01:26

2

最好的做法(甚至是一個編譯器選項來檢查)是所有方法都是以某種方式聲明的。爲了窺探「隱藏」輔助方法,其聲明爲這樣在執行.m文件,如:

#import Client; 

@interface myClass (Private) 
- (void) privateMethod; 
- (float) bankAccountBalanceForClient:(Client *)client; 
@end 

@implementation myClass 
- (void) privateMethod; 
{ 
    //foo here 
} 

等。私有方法是一個名爲Private的myClass方法的類。這個類別可以在任何地方聲明,即使在一個名爲私有方法的主.h文件中也是如此,儘管這會成爲維護的噩夢。

因此,使用公共方法的公共.h文件和.m文件來聲明私有方法,您將所有方法聲明在某處。我使用這個編譯器選項來確保和強制它,以便所使用的任何方法實際上是在某處(或者我得到一個語法錯誤)聲明,因此我沒有找到任何運行時崩潰,因爲找不到方法。

相關問題