?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Q?Q很多从其他语言Q例如C++Q{到objective c的初学者,往往会问C个问题,如何定义cȝU有函数Q这里的“私有函数”指的是Q某个函数只能在cȝ内部使用Q不能在cȝ外部Q或者派生类内部使用。事实上QObjective C中可以定义类的私有变量,但由于objective c是动态语aQ因此本质上是不存在U有函数的?/strong>但是Q也可以用一些机Ӟ来实现类似其他语a中私有函数的效果?/p> Q?Q一般来_可以使用两种方式来实现?/strong> W一U:只在.m文g中实现该函数Q不?h文g中声明,q样是最单的方式?/strong> .h文g @interfaceMyClass { // My Instance Variables } - (void)myPublicMethod; @end .m 文g: @implementationMyClass - (void)myPublicMethod { // Implementation goes here } - (void)myPrivateMethod { // Implementation goes here } @end 上面的myPrivateMethod函数只在m文g中实CQ没有在h文g中声明,那么外部׃能用:[obj myPrivateMethod]的方式调用,在派生类中也不能使用[super myPrivateMethod] 或者[self myPrivateMethod]的方式来调用?/p> W二U:在m文g中加上一个oc extensionQ在里面声明需要的U有函数?/strong> .h 文g: @interfaceMyClass { // My Instance Variables } - (void)myPublicMethod; @end .m 文g: @interfaceMyClass() - (void)myPrivateMethod; @end @implementationMyClass - (void)myPublicMethod { // Implementation goes here } - (void)myPrivateMethod { // Implementation goes here } @end 以上两种方式Q功能完全一P区别仅仅在于Q团队开发时Q后面一U的代码可读性更好,所以一般还是推荐后面一U方式?/p> Q?Q前面已l提刎ͼ对于Objective C来说Q真正意义上的私有函数是不存在的?/strong>因ؓ即用上q的ҎQ不在头文g中声明函敎ͼ外部也可以用objc_msgSend或者performSelector来调用这个函数?比如上面的myPrivateMethodQ在cȝ外部可以直接使用[obj performSelector:@selector(myPrivateMethod)]?来调用。有performSelector只能传一个参敎ͼ那么使用objc_msgSend(obj, @selector, ?Q就可以传N个参C。所以说Q用上面的机Ӟ可以实现cM其他语言中“私有函数”的效果Q但q不能完全保证这个函数是U有的?/p> 备注Q有人提刎ͼ可以用一个外部的block来实现私有函敎ͼ但是q其实意义不大,因ؓ在外部的block里面是不能访问类的self的,已经不算是成员函C?/p>