iOS专家之路

iOS 成员变量和属性

2019-04-03  本文已影响0人  YANGXIXIYear

平时开发过程中,一直在使用成员变量和属性,那其区别是什么呢?实例变量又是什么呢?

一、基本概念

@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/setter方法实现一些功能时,需要定义属性在.m中。

参考地址:
成员变量和属性区别(@property那点事儿)

上一篇下一篇

猜你喜欢

热点阅读