前言:
用@property定义的属性底层会扩展成_开头的成员变量,setter,getter方法。
例如:
/********Person.h文件********/
// 声明age属性
@property(nonatomic,assign)int age;
/********Person.m文件********/
// 同时重写属性的setter方法和getter方法,系统就不会帮我们生成下划线的成员变量_age,所以会报_age找不到的错误
// 解决办法:手动生成_age成员变量,即 @synthesize age = _age;
@synthesize age = _age;
-(void)setAge:(int)age{// 重写setter方法
_age=age;
}
-(int)age{// 重写getter方法
return _age;
}
开发中访问属性的做法
self.xxx = yyy; //有等号就是调用setter方法
self.xxx;//没有等号,或者self.xxx在等号右边就是调用getter方法。另外懒加载实质是调用getter方法
开发中,self.xxx和_xxx区别
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,assign)int age;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// self.xxx的形式.
self.age = 100;// 底层调用setter方法 -(void)setAge:(int)age{ _age=age;},给_age赋值
NSLog(@"%d",self.age);// 底层调用getter方法 -(int)age{return _age;} 获取到_age,
// _xxx的形式
_age = 200;// 底层直接对setter方法中的_age赋值,不会调用setter方法
NSLog(@"%d",self.age);// 调用getter方法,看是否已经对_age完成了赋值
}
@end
- 用@property关键字来声明的属性,在编译期会默认生成一个下划线加名称的属性变量,并且自动在implemention文件中生成setter和getter方法。
- 使用_xxx的方式是操作变量,而通过点语法调用self.xxx这种形式,实际是调用setter方法或者getter方法