(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的,已经不算是成员函数了。

参考:http://stackoverflow.com/questions/647079/is-it-possible-to-declare-a-method-as-private-in-objective-c

http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c/651852#651852

最新文章

  1. 2017年1月3日 星期二 --出埃及记 Exodus 21:29
  2. JAVA期末设计第十三周
  3. Linux多线程系列-2-条件变量的使用(线程安全队列的实现)
  4. C# DllImport用法和路径问题
  5. NBUT 1186 Get the Width(DFS求树的宽度,水题)
  6. DB2命令大全
  7. linux 监控
  8. HDU 4981 Goffi and Median
  9. Cocos2d-x Box2D物理引擎编译设置
  10. MySQL InnoDB下关于MVCC的一个问题的分析
  11. 解决chrome安装谷歌访问助手错误问题
  12. 关于PCB开窗
  13. oracle查看表名称和表字段注释
  14. ORA-01950: no privileges on tablespace XXX
  15. Mongodb 分享(一)
  16. Java8系列之重新认识HashMap
  17. ansible 学习记录
  18. Multi-cloud Kubernetes with Triton
  19. java(2) 面向对象
  20. [Selenium]点击下拉框之后,从下拉列表选择元素进行点击很容易失败

热门文章

  1. 代理IP爬取和验证(快代理&西刺代理)
  2. Mac下载工具软件提示损坏
  3. wordpress通过$wpdp更新数据表内容
  4. 使用GDAL进行波段分离
  5. H5本地存储(转)
  6. execl文件读取封装
  7. 49.Django起步学习
  8. Ext 默认时间
  9. 【leetcode算法-简单】28. 实现strStr
  10. 工作总结--CTO(张王岩)IO的正式使用