《52個(gè)有效方法》筆記2——關(guān)于“屬性”的一些細(xì)節(jié)

關(guān)于“屬性”

屬性的作用域:

很多語言在定義屬性時(shí)可以指定其作用域(private/public等),OC中也有該關(guān)鍵字(@private/@public),不過幾乎不會(huì)用到。因?yàn)檫@種寫法導(dǎo)致的結(jié)果:對象布局在編譯期就已經(jīng)確定了。這有什么問題嗎逸寓?
嗯,是有問題的。
對象的屬性在內(nèi)存中被訪問是通過其和對象在內(nèi)存中的偏移量來查找的康吵。這種寫法的問題是當(dāng)你給對象新加入一個(gè)屬性后,原來各屬性的偏移量會(huì)弄錯(cuò)亂访递,所以需要重新編譯晦嵌。例如,某代碼庫中的一個(gè)類使用的是舊的類定義拷姿,而和它進(jìn)行鏈接的類卻新定義了屬性惭载,那么就會(huì)出現(xiàn)不兼容現(xiàn)象。
OC解決這種問題的方案是在運(yùn)行期才進(jìn)行判斷响巢,若發(fā)現(xiàn)類的定義變了描滔,則按照最新的(此時(shí)已編譯過)偏移量去查找屬性。這是極好極安全的踪古。

由屬性自動(dòng)合成存取方法(setter/getter):
@property (nonatomic, copy)NSString         *userName;

@property會(huì)自動(dòng)在我們的屬性名前加下劃線含长,所以真正的屬性名是_userName券腔。

@synthesize userName = _myUserName;用于自定義屬性名,此時(shí)屬性名是_myUserName;(不過一般情況下貌似沒有自定義屬性名的這個(gè)必要)拘泞。
最重要的是編譯器會(huì)幫我們生成屬性存取方法纷纫。而你若想阻止編譯器自動(dòng)合成setter和getter方法,則可以使用@dynamic userName;關(guān)鍵字陪腌。需要注意的是@synthesize和@ dynamic關(guān)鍵字都是寫在.m文件的@implementation下的辱魁。

修飾屬性的一些關(guān)鍵字
  • 原子性:所謂原子性,就是說在操作該屬性時(shí)會(huì)加鎖诗鸭,確保讀寫正確染簇。atomic代表該屬性是原子性的,而nonatomic則相反强岸,代表非原子性的锻弓。一般情況下我們都使用nonatomic,因?yàn)樵有缘拇鷥r(jià)是性能消耗厲害蝌箍。
  • 讀寫權(quán)限:readonly代表只可讀弥咪,writeonly代表只可寫。
  • 內(nèi)存管理:在這里我只說copy十绑,因?yàn)橐郧皩opy沒有深入理解過聚至。

關(guān)于為什么NSString類型的屬性要用copy

屏幕快照 2015-12-12 23.23.48.png

注意:我們定義屬性時(shí)在@property后加了這些修飾詞后,編譯器會(huì)幫我們自動(dòng)合成滿足這些條件的存取方法:

- (void)setUserName:(NSString *)userName
{
    if(_userName!=userName)
    {
        _userName = [userName copy];
    }
}

同理本橙,我們自定義初始化方法時(shí)也要遵守我們定義屬性時(shí)的語義扳躬。既然屬性_userName是NSString類型的,是被copy修飾的甚亭,那我們定義初始化方法時(shí)就應(yīng)該這樣:

- (id)initWithUserName:(NSString *)userName
{
    self = [super init];
    if(self)
    {
        _userName = [userName copy];
    }
    
    return self;
}
使用_userName還是self.userName贷币?

在對象內(nèi)部是直接訪問實(shí)例變量呢(_userName)?還是通過存取方法訪問呢(setter/getter)亏狰?
直接訪問_userName當(dāng)然速度更快役纹。
但是繞過了存取方法,我們定義屬性時(shí)的修飾語義也就不會(huì)落實(shí)暇唾。比如促脉,沒有了給_userName屬性賦值時(shí)的copy處理,則不太安全策州。
而且直接訪問_userName不會(huì)觸發(fā)鍵值觀察(KVO),這個(gè)具體情況做取舍瘸味。
所以,綜上所述够挂,我們折中的方案是:在獲取屬性值時(shí)直接讀取實(shí)例變量_userName旁仿;而在賦值時(shí)要通過setter方法。

    NSLog(@"%@",_userName); // 讀取
    self.userName = @"wang66"; // 賦值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孽糖,一起剝皮案震驚了整個(gè)濱河市枯冈,隨后出現(xiàn)的幾起案子毅贮,更是在濱河造成了極大的恐慌,老刑警劉巖尘奏,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滩褥,死亡現(xiàn)場離奇詭異,居然都是意外死亡罪既,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門铡恕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琢感,“玉大人,你說我怎么就攤上這事探熔【哉耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵诀艰,是天一觀的道長柬甥。 經(jīng)常有香客問我,道長其垄,這世上最難降的妖魔是什么苛蒲? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绿满,結(jié)果婚禮上臂外,老公的妹妹穿的比我還像新娘。我一直安慰自己喇颁,他們只是感情好漏健,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橘霎,像睡著了一般蔫浆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姐叁,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天瓦盛,我揣著相機(jī)與錄音,去河邊找鬼外潜。 笑死谭溉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橡卤。 我是一名探鬼主播扮念,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碧库!你這毒婦竟也來了柜与?” 一聲冷哼從身側(cè)響起巧勤,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弄匕,沒想到半個(gè)月后颅悉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迁匠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年剩瓶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片城丧。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡延曙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亡哄,到底是詐尸還是另有隱情枝缔,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布蚊惯,位于F島的核電站愿卸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏截型。R本人自食惡果不足惜趴荸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宦焦。 院中可真熱鬧赊舶,春花似錦、人聲如沸赶诊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舔痪。三九已至寓调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锄码,已是汗流浹背夺英。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滋捶,地道東北人痛悯。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像重窟,于是被迫代替她去往敵國和親载萌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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