| 網站首頁 | 關于我們 | 開發(fā)優(yōu)勢 | 產品展示 |
| 合作企業(yè) | 新聞動態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟南軟件開發(fā) 時間:2016年12月20日
(1)很多從其他語言(例如C++)轉到objective c的初學者,往往會問到一個問題,如何定義類的私有函數(shù)?這里的“私有函數(shù)”指的是,某個函數(shù)只能在類的內部使用,不能在類的外部,或者派生類內部使用。事實上,Objective C中可以定義類的私有變量,但由于objective c是動態(tài)語言,因此本質上是不存在私有函數(shù)的。但是,也可以用一些機制,來實現(xiàn)類似其他語言中私有函數(shù)的效果。
(2)一般來說,可以使用兩種方式來實現(xiàn)。
第一種:只在.m文件中實現(xiàn)該函數(shù),不在.h文件中聲明,這樣是最簡單的方式。
.h文件
@interfaceMyClass
{
// My Instance Variables
}
- (void)myPublicMethod;
@end
.m 文件:
@implementationMyClass
- (void)myPublicMethod
{
// Implementation goes here
}
- (void)myPrivateMethod
{
// Implementation goes here
}
@end
上面的myPrivateMethod函數(shù)只在m文件中實現(xiàn)了,沒有在h文件中聲明,那么外部就不能使用:[obj myPrivateMethod]的方式調用,在派生類中也不能使用[super myPrivateMethod] 或者[self myPrivateMethod]的方式來調用。
第二種:在m文件中加上一個oc extension,在里面聲明需要的私有函數(shù)。
.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
以上兩種方式,功能完全一樣,區(qū)別僅僅在于,團隊開發(fā)時,后面一種的代碼可讀性更好,所以一般還是推薦后面一種方式。
(3)前面已經提到,對于Objective C來說,真正意義上的私有函數(shù)是不存在的。因為即使用上述的方法,不在頭文件中聲明函數(shù),外部也可以使用objc_msgSend或者performSelector來調用這個函數(shù)。 比如上面的myPrivateMethod,在類的外部可以直接使用[obj performSelector:@selector(myPrivateMethod)]… 來調用。有人說performSelector只能傳一個參數(shù),那么使用objc_msgSend(obj, @selector, …),就可以傳N個參數(shù)了。所以說,用上面的機制,可以實現(xiàn)類似其他語言中“私有函數(shù)”的效果,但并不能完全保證這個函數(shù)是私有的。
備注:有人提到,可以用一個外部的block來實現(xiàn)私有函數(shù),但是這其實意義不大,因為在外部的block里面是不能訪問類的self的,已經不算是成員函數(shù)了。
想要了解更多詳情歡迎來電咨詢18678812288
登陸網址:m.h6244.cn。
聯(lián)系人:王經理。