关于@private 、@protected、@public 、
基础概念
要知道OC中这几个关键词的作用要先了解一些基础的概念,就是实例变量
实例变量是指为类申明的变量,他们在相应的类实例(即对象)的生命周期中存在并拥有值,当对象被创建时,系统会为实例变量分配内存,当对象被释放时系统也会释放变量占用的内存。
实例变量把值存起来了,他所属的类想怎么访问就怎么访问,但是,只能和自己玩没意思,于是把实例变量暴露到@interface 去,但是这会违反 OOP的关键宗旨之一-- 封装。因此,我们更多使用声明实例变量是在 @implementation,如果外部硬要使用,我们也只能放在@interface 中了。不过,我们可以进行访问控制。
如何访问控制
这时,该@private ,@protected @public @package 出场了。
- @private 还是自己玩,只能自己的实例去访问。
- @protected 实例变量可以供自己和自己的后代类玩(包括子类,孙类,子子孙孙无穷类)
- @public 可被任何代码随意蹂躏。
-
@package 可被其他类实例和函数访问 ,但是在其所属应用包的外部,他会被视为私有变量。这种作用范围可以用于库或者框架类。
实例变量
实例变量的外部访问方式是 ->
,有没有一些高大上的点语法访问之类的呢?有的,各位看官请往下看
自动申明属性
@property 关键词为类声明了一个属性,他能提供获取对象内部状态的方法(也就是 getter/setter方法),这里的内部状态主要是指该属性自动生成的带下划线开头与属性同名的实例变量。
自动的东西,有时候是多余的,有时候我们并不想生成 getter/setter方法 ,这个时候也有办法,用@dynamic关键字 动态生成
他叫动态生成,其实就是自己去实现 getter/setter方法,如果没有实现,运行起来会出错的,告知发送了一条消息给一个未知对象。这应该就是他为什么叫动态生成的原因吧。
搞事情
-
我们可以在声明属性的时候给他一些特性,例如 noatomic ,assign,retain,copy,strong,weak,readwrite,read-only ,改掉 getter/setter方法名 :getterr = getterName ,setter=setterName;
- 我们还可以重写 getter/setter方法,方法里偷梁换柱 我在搞事情
至此,我们就可以愉快的使用点语法跟我们的属性一起玩耍啦。