平时开发过程中,一直在使用成员变量和属性,那其区别是什么呢?实例变量又是什么呢?
一、基本概念
@interface ViewController ()
{
NSString *name;
}
@property (nonatomic, strong) NSString *birthday;
@end
如上图所示:
1、{ }
中定义的变量为成员变量,name则为成员变量
2、@property
声明属性,birthday为属性
二、发展历史
@interface ViewController ()
{
// 1. 声明成员变量
NSString *name;
}
// 2. @property 声明实例变量
@property (nonatomic, copy) NSString *name;
@end
@implementation ViewController
// 3. @synthesize生成set方法
@synthesize name;
** 上述写法为iOS5以前的写法,因为当时的编译器为GCC,所以属性的正常写法需要成员变量 + @property + @synthesize
** 缺少@synthesize,编译器会报警告,因为该步骤是生成setter/getter方法
** 该方法不会自动生成以下划线开头的实例变量_name
** 通过@synthesize name = xxx;指定与属性对应的实例变量为xxx,操作self.name
时则是操作实例变量xxx,而非_name
** iOS5以后,编译器转换为LLVM后,@property
声明的属性会默认生成_
类型的成员变量,也会生成setter/getter 方法
三、成员变量
@interface ViewController ()
{
NSString *name;
}
上述代码声明了一个成员变量,没有setter/getter
方法,所以不能用self.name的形式来访问,可以直接用name,也可以用self->name
self->name = @"你好";
NSLog(@"%@", name);
为什么不能用点语法访问???因为OC中点语法是调用对象的setter或getter方法,而成员变量没有该两种方法,所以不能用点语法访问。
四、属性
成员变量只用于类的内部,外界无法访问,那什么变量可以被外界访问呢?那就是属性变量
@interface ViewController ()
@property (nonatomic, strong) NSString *name;
@end
1、属性在创建过程中自动生成了setter和getter方法,可允许其他对象访问,可以用点语法访问;
2、@property
声明的属性会默认生成_类型的成员变量,在本类中可以用下划线访问该属性对象;
3、可以重写其getter和setter方法。
五、实例变量
@interface ViewController ()
{
NSString *birthday;
int age;
}
@end
上面讲发展历史时,提到实例变量这个概念,什么是实例变量呢?
1、实例(instance)即为类的表现,实例变量的本质是成员变量,实例变量是成员变量的一种特殊情况;
2、成员变量 = 实例变量 + 基本数据类型变量,birthday和age均为成员变量,birthday为实例变量,age为基本数据类型变量;
总结:
1、成员变量是不与外界接触的变量,应用于类的内部,所以当用于类内部,属性为private
时,就可以将变量定义为成员变量;
2、属性变量可以让其他对象访问,可以设置只读、只写等属性,当属性为public
时,定义属性在.h
中;
3、当类的内部需要用getter/sette
r方法实现一些功能时,需要定义属性在.m
中。
参考地址:
成员变量和属性区别(@property那点事儿)
网友评论