关于Objective C的私有函数

浏览:
字体:
发布时间:2013-12-11 11:03:03
来源:
(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的,已经不算是成员函数了。
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();