setter方法和getter方法 self.xxx和_xxx区别

前言:

用@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
Snip20160913_1.png
  • 用@property关键字来声明的属性,在编译期会默认生成一个下划线加名称的属性变量,并且自动在implemention文件中生成setter和getter方法。
  • 使用_xxx的方式是操作变量,而通过点语法调用self.xxx这种形式,实际是调用setter方法或者getter方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容