成员变量
@interface MyViewController :UIViewControlle
{
UIButton *yourButton;
int count;
id data;
}
成员变量用于类内部,无需与外界接触的变量,在.m中成员变量的修饰符为@private,在.h中成员变量的修饰符@protected。
一般情况下,非子类对象无法访问因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。 因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。
访问属性时本质上通过消息机制在调用setFriend:方法:
实例变量
实例变量本质上就是成员变量,只是实例是针对类而言。
实例变量+基本数据类型变量=成员变量
访问实例变量就是在运行期查找成员的偏移量,这样就计算出了成员相应位置的内存地址,从而直接访问其内存。
属性变量
@interface MyViewController :UIViewControlle
@property (nonatomic, strong) UIButton *myButton;
@end
属性变量是用于与其他对象交互的变量。 属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。 当然,你可以设置只读或者可写等,设置方法也可自定义。 现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。
成员变量和属性变量优缺点比较
1. 在访问效率上的比较 ------实例变量完胜
2. 在内存管理语义上的比较 ------属性完胜
3. KVO触发机制上的比较 ------- 属性略胜
4. 在调试错误上的比较 ------ 属性胜
通过属性来访问可以来帮助排查与之相关的错误,因为我们有机会在set/get方法中增加断点,而实例变量无法做到。