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方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容