oc是没有私有属性的,即使是写在.m文件中,又有@private修饰,也可以通过setValueforKey来实现赋值和修改。放在.m里面只是增加他的隐蔽性。
所以同在.m文件中的成员变量和属性有什么区别呢?
1.访问方式
比如_name和self.name
_name访问的时候,在程序编译期间就知道他的内存地址,运行时直接去该地址访问变量;
self.name是在运行时通过消息机制动态访问变量的,点语法调用的是属性的getter或者setter方法。
_name的性能更好,但是有一个隐患,比如用runtime机制在运行的过程中动态的添加成员变量,如果这个成员变量的内存地址在_name的前面,那么用这种硬编码方式就是会出错。
(解释_name如何寻址:对象布局在编译期的时候已经固定了,只要碰到访问_name的代码,编译器就会把它替换成偏移量,这个偏移量是硬编码。表示该变量距离存放对象的内存区域的起始地址有多远)
所以,如果是需要外部对象访问的,用属性比较方便,成员变量可以记录对象内部的状态改变。