iOS 成员变量 实例变量 属性变量
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
UIButton *button;
int count;
id data;
}
@property (nonatomic, strong) UIButton *myButton;
@end
在{ }中声明的变量都是成员变量;
按照上面的例子:button count data都是成员变量;
实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明;
按照上面的例子:button是实例变量 data也是实例变量,因为id是OC特有的类,本质上来说id等同于(void *);
实例变量的英文翻译为 Instance Variable (object-specific storage)
实例的英文翻译为 Instance (manifestation of a class) 说的是"类的表现",说明实例变量应该是由类定义的变量!
除去基本数据类型int float ....等,其他类型的变量都叫做实例变量;
实例变量 + 基本数据类型变量 = 成员变量
成员变量是定义在{ }号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量;
成员变量用于内部,无需与外界接触的变量,因为成员变量不会生成set、get方法,所以外界无法与成员变量接触;
由于实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。
根据成员变量的私有性,为了方便访问,所以就有了属性变量;
属性变量是用于与其他对象交互的变量;
属性变量的好处就是允许让其他对象访问到该变量,因为属性创建过程中自动产生了set方法和get方法;当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。
但是,现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。
单独提出的一个主意点:类别中的属性property
类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。
经常会在iOS的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的,必须自己实现get/set方法。
注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
OC的分类允许给分类添加属性,但不会自动生成getter、setter方法,不过最好还是不要使用;
如果声明了属性,在实现文件中编译器会提示用 @dynamic 属性名字 来告诉开发者自己来写属性的setter方法和getter方法,而这里实现setter和getter需要用到声关联对象(存取方法在运行时动态创建绑定)。
在声明property属性后,有2种实现选择
@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告;
然后由自己实现存取方法或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行的时动态生成子类属性