Objective-C的面向对象中,类有真正的私有方法和私有属性么?
在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中其实并无真正意义上的的私有方法和私有属性。但是在实际使用中,我们应遵守规则,不能调用的方法,不调用。
Objective-C的面向对象中,类有真正的私有方法和私有属性么?的更多相关文章
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- PHP面向对象中常用的关键字和魔术方法
PHP面向对象中常用的关键字 final 1.final不能修饰成员属性(类中常量不是用这个关键字) 2.final只能修饰类和方法 作用: 使用fi ...
- 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法
类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{ public $name;//成员变量 //成员属性(存在于强类型语言中) prot ...
- 面向对象(类,实例变量,方法定义,方法重载,构造方法,this,string类)
面向对象 类是由属性和方法组成 类是所有创建对象的模板 实例变量有默认值 实例变量至少在本类范围中有效 实例变量与局部变量冲突时,局部变量优先 类中方法定义类似于函数定义 修饰符 返回值类型 方法名( ...
- Python面向对象中的classmethod类方法和__getattr__方法介绍
一.classmethod介绍 介绍:@classmethod修饰符我们从名称就可以知道,这是一个类方法,那么和普通的类中的方法有什么不同的 a.类方法,是由类本身调用的,无需实例化类,直接用类本身调 ...
- (转)Delphi7中QuickReport组件(QReport报表)安装方法及重要属性
Delphi7中没有办法直接使用QuickReport组件,因为在Delphi7中没有将QuickReport组件包作为默认组件打包,如果要使用此组件,需要先安装一下. 打开delphi7,点 ...
- Python中面向对象和类
目录 面向对象 类的定义 类的访问 类的属性和方法 继承和多态 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象: 类(C ...
- 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式
本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...
随机推荐
- JavaScript读二进制文件并用ajax传输二进制流
综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...
- background-clip,background-origin
开门见山,简单来说 background-origin定义了background的绘制区域(就是从什么地方开始绘制),三个属性 padding-box 背景图像相对于内边距框来绘制border-box ...
- linux 下搭建svn
Update 程序设计中的“后悔药”——SVN 一.历史起源 1.版本控制软件 答:主要是对源代码版本进行控制与管理 2.版本控制软件起源 CVS:最早期的开源的版本控制软件(开源奇葩) VSS: ...
- 。。。在学习新框架Spring MVC的感受。。。
已经学习一遍Spring MVC了,感觉还是懵懵懂懂的,特别是重定向,路径,参数的这些问题,心好乱,不过,这,都不是问题!!! 继续努力,努力到会为止!!!加油!!!
- android sdk manager 无法更新解决方法
因为在开始->运行->cmd 中敲入 ping dl-ssl.google.com -t 始终ping不通 ,关闭cmd后 首先需要下载一个代理服务器下载地址 http://pan.bai ...
- xcode编译错误
1.xcode无效文件的编译错误. 问题: clang: error: no such file or directory: '/Users/admin/client/trunk/sengoku_sc ...
- degign new theme for Filezilla(Mac OS X)
the theme directory is located at Filezilla.app/Contents/SharedSupport/resources/ the dirs (excludin ...
- java Jsoup 抓取页面数据
List<ImageBean> imgList = new ArrayList<ImageBean>(); ImageBean image = null; String ima ...
- android录像增加时间记录(源码里修改)
需要做一个功能,录像和播放时都显示录时的时间,参考文章链接找不到了,不好意思,这里记录一下,防止下次找不到了.另一篇关于源码录像的流程请参考 http://www.verydemo.com/demo_ ...
- 创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package com.chuoji; public class People { private String name; private int age; private String sex; ...