(1)不少從其餘語言(例如C++)轉到objective c的初學者,每每會問到一個問題,如何定義類的私有函數?這裏的「私有函數」指的是,某個函數只能在類的內部使用,不能在類的外部,或者派生類內部使用。事實上,Objective C中能夠定義類的私有變量,但因爲objective c是動態語言,所以本質上是不存在私有函數的。可是,也能夠用一些機制,來實現相似其餘語言中私有函數的效果。objective-c
(2)通常來講,可使用兩種方式來實現。函數
第一種:只在.m文件中實現該函數,不在.h文件中聲明,這樣是最簡單的方式。spa
.h文件 @interfaceMyClass { // My Instance Variables } - (void)myPublicMethod; @end .m 文件: @implementationMyClass - (void)myPublicMethod { // Implementation goes here } - (void)myPrivateMethod { // Implementation goes here } @end
上面的myPrivateMethod函數只在m文件中實現了,沒有在h文件中聲明,那麼外部就不能使用:[obj myPrivateMethod]的方式調用,在派生類中也不能使用[super myPrivateMethod] 或者[self myPrivateMethod]的方式來調用。code
第二種:在m文件中加上一個oc extension,在裏面聲明須要的私有函數。orm
.h 文件: @interfaceMyClass { // My Instance Variables } - (void)myPublicMethod; @end .m 文件: @interfaceMyClass() - (void)myPrivateMethod; @end @implementationMyClass - (void)myPublicMethod { // Implementation goes here } - (void)myPrivateMethod { // Implementation goes here } @end
以上兩種方式,功能徹底同樣,區別僅僅在於,團隊開發時,後面一種的代碼可讀性更好,因此通常仍是推薦後面一種方式。blog
(3)前面已經提到,對於Objective C來講,真正意義上的私有函數是不存在的。由於即便用上述的方法,不在頭文件中聲明函數,外部也可使用objc_msgSend或者performSelector來調用這個函數。 好比上面的myPrivateMethod,在類的外部能夠直接使用[obj performSelector:@selector(myPrivateMethod)]… 來調用。有人說performSelector只能傳一個參數,那麼使用objc_msgSend(obj, @selector, …),就能夠傳N個參數了。因此說,用上面的機制,能夠實現相似其餘語言中「私有函數」的效果,但並不能徹底保證這個函數是私有的。開發
備註:在下面附上的帖子裏有人提到,能夠用一個外部的block來實現私有函數,可是這其實意義不大,由於在外部的block裏面是不能訪問類的self的,已經不算是成員函數了。it
參考:http://stackoverflow.com/questions/647079/is-it-possible-to-declare-a-method-as-private-in-objective-cio
http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c/651852#651852form