iOS-成員變量和屬性的區(qū)別

目錄
  • 歷史由來
  • @dynamic與@synthesize的區(qū)別
  • 總結
一 歷史由來

在 iOS5之前彼宠,屬性的正常寫法需要三個步驟

  • 成員變量
  • @property
  • @synthesize

實例代碼

@interface ViewController () {
    // 1.聲明成員變量
    NSString *name;
}
// 2.用@property
@property(nonatomic, copy)NSString *name;
@end

@implementation ViewController
// 3.最后在@implementation中用synthesize生成set方法
@synthesize name;

如果漏寫了 @synthesize,則編譯時會有警告

Autosynthesized property 'name' will use synthesized instance variable
 '_name', not existing instance variable 'name'

在iOS5之后慎冤,蘋果推出一個新機制睡腿,@property聲明的屬性默認會生成一個_類型的成員變量,同時也會生成setter/getter方法藻三。

其實鳞陨,發(fā)生這種狀況根本原因是蘋果將默認編譯器從GCC轉換為LLVM(low level virtual machine)颠猴,才不再需要為屬性聲明實例變量了。

更換為LLVM之后坡贺,編譯器在編譯過程中發(fā)現(xiàn)沒有新的實例變量后官辈,就會生成一個下劃線開頭的實例變量。因此現(xiàn)在我們不必在聲明一個實例變量遍坟。(注意:是不必要拳亿,不是不可以

在.m文件中,編譯器也會自動的生成一個實例變量_name愿伴。那么在.m文件中可以直接的使用_name實例變量风瘦,也可以通過屬性self.name都是一樣的。

注意這里的self.myString其實是調用的myString屬性的setter/getter方法公般。這與C++中點的使用是有區(qū)別的万搔,C++中的點可以直接訪問成員變量(也就是實例變量)。

實戰(zhàn)檢驗

1.直接聲明成員變量

@interface ViewController () {
    NSString *name;
}
@end

在這段代碼里面只是聲明了一個成員變量官帘,并沒有setter/getter方法瞬雹。所以訪問成員變量時,可以直接訪問name刽虹,也可以像C++一樣用self->name來訪問酗捌。

// 訪問1
name = @"韓雪";
NSLog(@"name = %@",name);

// 訪問e2
self->name = @"孫悟空";
NSLog(@"name = %@",self->name);

打印結果

image.png

但絕對不能用self.name來訪問

self.name = @"韓雪";

會直接報錯

image.png

擴展:很多人覺得OC中的點語法比較奇怪,實際是OC設計人員有意為之涌哲。

  • 點表達式(.)看起來與C語言中的結構體訪問以及java語言匯總的對象訪問有點類似胖缤,如果點表達式出現(xiàn)在等號=左邊,調用該屬性名稱的setter方法阀圾。如果點表達式出現(xiàn)在=右邊哪廓,調用該屬性名稱的getter方法。
  • OC中點表達式(.)其實就是調用對象的setter和getter方法的一種快捷方式初烘,self.myString = @"張三";實際就是[self setmyString:@"張三"];

首先我們要明白涡真,@synthesize生成了setter/getter方法。

雖然現(xiàn)在直接使用@property時肾筐,編譯器會自動為你生成以下劃線開頭的實例變量_myString哆料,不需要自己手動再去寫實例變量。而且也不在.m文件中通過@synthesize myString吗铐;生成setter/getter方法东亦。但在看老代碼的時候,我們依舊可以看到有人使用成員變量+ @synthesize成員變量的形式唬渗。

@synthesize還有一個作用典阵,可以指定與屬性對應的實例變量奋渔,

例如@synthesize name = xxx;
那么self.name其實是操作的實例變量xxx萄喳,而非_name了卒稳。

  • 實例代碼1
@synthesize name = myName;

self.name = @"韓雪";
NSLog(@"_name = %@",self->_name);

打印結果

image.png
  • 實例代碼2
@synthesize name = myName;

self.name = @"韓雪";
NSLog(@"_myName = %@",self->myName);

打印結果

image.png
二 @dynamic與@synthesize的區(qū)別
2.1 @dynamic

dynamic告訴編譯器蹋半,不自動生成getter/setter方法他巨,

  • 實例代碼
@interface ViewController ()
@property(nonatomic, copy)NSString *name;
@end

@implementation ViewController

@dynamic name;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.name = @"韓雪";
    NSLog(@"name = %@",self.name);
}
@end

運行結果 - 直接崩潰,報方法找不到的錯誤

image.png
2.2 @synthesize

@synthesize編譯器期間减江,讓編譯器自動生成getter/setter方法染突。
當有自定義的存或取方法時,自定義會屏蔽自動生成該方法

  • 實例代碼
@synthesize name = _myName;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.name = @"韓雪";
    NSLog(@"name = %@",self.name);
}

// 自定義 set 方法
- (void)setName:(NSString *)name {
    _myName = @"孫悟空";
}

// 自定義 get方法
- (NSString *)name {
    return _myName;
}

打印結果

image.png
總結
  • 成員變量
1. 成員變量的默認修飾是@protected辈灼。
2. 成員變量不會自動生成set和get方法份企,需要自己手動實現(xiàn)。
3. 成員變量不能用點語法調用巡莹,因為沒有set和get方法司志,只能使用->調用。
  • 屬性
1. 屬性的默認修飾是@protected降宅。
2. 屬性會自動生成set和get方法骂远。
3. 屬性用點語法調用,點語法實際上調用的是set和get方法腰根。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末激才,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子额嘿,更是在濱河造成了極大的恐慌瘸恼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册养,死亡現(xiàn)場離奇詭異东帅,居然都是意外死亡,警方通過查閱死者的電腦和手機球拦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門冰啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刘莹,你說我怎么就攤上這事阎毅。” “怎么了点弯?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵扇调,是天一觀的道長。 經(jīng)常有香客問我抢肛,道長狼钮,這世上最難降的妖魔是什么碳柱? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮熬芜,結果婚禮上莲镣,老公的妹妹穿的比我還像新娘。我一直安慰自己涎拉,他們只是感情好瑞侮,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鼓拧,像睡著了一般半火。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上季俩,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天钮糖,我揣著相機與錄音,去河邊找鬼酌住。 笑死店归,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的酪我。 我是一名探鬼主播消痛,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祭示!你這毒婦竟也來了肄满?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤质涛,失蹤者是張志新(化名)和其女友劉穎稠歉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汇陆,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡怒炸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毡代。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅羹。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖教寂,靈堂內(nèi)的尸體忽然破棺而出捏鱼,到底是詐尸還是另有隱情,我是刑警寧澤酪耕,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布导梆,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏看尼。R本人自食惡果不足惜递鹉,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏斩。 院中可真熱鬧躏结,春花似錦、人聲如沸狰域。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽北专。三九已至禀挫,卻和暖如春旬陡,著一層夾襖步出監(jiān)牢的瞬間拓颓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工描孟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驶睦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓匿醒,卻偏偏與公主長得像场航,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廉羔,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容