在Java/C#等面向对象语言中,方法的访问权限可以通过public/private/protected来控制其访问权限。而在OC中,方法却并没有访问修饰符。那么,我们有没有办法使其方法变为私有?

1. 如果一个方法不在头文件中声明,那么这个方法在编译期,通过[receiver MethodName]的形式向对象发送消息,编译器会有警告,告诉你未找到该方法,但是实际运行时,依然可以正常运行

原因:编译时,即使这个方法不在头文件中声明,编译器仍然会将方法的签名编译进类的方法列表中, 发送消息时,会自动查找消息列表,如果找到同名消息,则会被触发)

2.如果一个方法在匿名分类中定义,那么在编译期,编译器通过[receiver MethodName]的形式向对象发送消息,编译器仍然会有警告,告诉你未找到该方法,但是实际运行时,仍然可以正常运行

原因:同上

结论:在OC中,其实并无真正意义上的私有方法。

有真正的私有属性么?

1. 如果将一个属性在方法的匿名分类中定义,那么在编译期,通过obj.prop 向属性赋值时,编译器会提示错误,编译不通过。 这么看来,貌似是可以定义私有属性的。

但是。。。。

我们知道,OC中所有的方法调用都是通过消息传递,即使你使用了obj.prop 这种点语法去为对象属性赋值,其编译后的代码仍然是转换为消息的调用。

obj.prop 其实是向对象发送了一个setProp方法,等价于[obj setProp] 。

根据上面的解释,如果你用[obj setProp] 去向这个所谓的"私有属性"赋值,仍然可以赋值成功,并且可以正常使用。

综上,OC中其实并无真正意义上的的私有方法和私有属性。但是在实际使用中,我们应遵守规则,不能调用的方法,不调用。

最新文章

  1. 执行Hadoop job提示SequenceFile doesn't work with GzipCodec without native-hadoop code的解决过程记录
  2. iOS开发多线程篇—线程安全
  3. Uinty3d 镜面反射代码
  4. Unix C++(boost) 线程同步和线程组
  5. 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍
  6. POJ2112Optimal Milking(二分法+floyd最短+网络流量)
  7. mongoDB & Nodejs 访问mongoDB (二)
  8. pouchdb-find( pouchdb查询扩展插件 ,便于查询)
  9. equals()和==的区别
  10. 每周.NET前沿技术文章摘要(2017-05-24)
  11. 文件上传详解 (HTML FILE)
  12. emacs常用指令
  13. bootstrap DataTable绑定数据带服务器分页
  14. pytest文档14-函数传参和firture传参数request
  15. maven添加settings.xml使用阿里云仓库
  16. [CentOS7][ssh][publickey][troubleshoot] 通过密钥登录ssh故障排查
  17. 用C实现单隐层神经网络的训练和预测(手写BP算法)
  18. SD卡驱动学习
  19. CF 662C Binary Table
  20. mysql中数据导出成excel文件语句

热门文章

  1. !! 据说年薪30万的Android程序员必须知道事
  2. Debian系列Linux/Ubuntu 安装软件
  3. python 练习(一)代码统计工具的实现
  4. 阿里云OneinStack数据库相关
  5. java 级联删除文件夹下的所有文件
  6. WF(二)
  7. Linux下环境变量设置
  8. 数据转换为json格式的方法
  9. Scrum Meeting 8-20151210
  10. Scrum Meeting 6-20151208