程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 關於Objective C的私有函數

關於Objective C的私有函數

編輯:關於C
(1)很多從其他語言(例如C++)轉到objective c的初學者,往往會問到一個問題,如何定義類的私有函數?這裡的“私有函數”指的是,某個函數只能在類的內部使用,不能在類的外部,或者派生類內部使用。事實上,Objective C中可以定義類的私有變量,但由於objective c是動態語言,因此本質上是不存在私有函數的。但是,也可以用一些機制,來實現類似其他語言中私有函數的效果。       (2)一般來說,可以使用兩種方式來實現。    第一種:只在.m文件中實現該函數,不在.h文件中聲明,這樣是最簡單的方式。     .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]的方式來調用。         第二種:在m文件中加上一個oc extension,在裡面聲明需要的私有函數。      .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   以上兩種方式,功能完全一樣,區別僅僅在於,團隊開發時,後面一種的代碼可讀性更好,所以一般還是推薦後面一種方式。   (3)前面已經提到,對於Objective C來說,真正意義上的私有函數是不存在的。因為即使用上述的方法,不在頭文件中聲明函數,外部也可以使用objc_msgSend或者performSelector來調用這個函數。 比如上面的myPrivateMethod,在類的外部可以直接使用[obj performSelector:@selector(myPrivateMethod)]… 來調用。有人說performSelector只能傳一個參數,那麼使用objc_msgSend(obj, @selector, …),就可以傳N個參數了。所以說,用上面的機制,可以實現類似其他語言中“私有函數”的效果,但並不能完全保證這個函數是私有的。   備注:在下面附上的帖子裡有人提到,可以用一個外部的block來實現私有函數,但是這其實意義不大,因為在外部的block裡面是不能訪問類的self的,已經不算是成員函數了。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved