@property的本質(zhì)

@property的本質(zhì)

@property = ivar(實(shí)例變量)+getter + setter(存取方法)

“屬性” (property)作為 Objective-C 的一項(xiàng)特性刹枉,主要的作用就在于封裝對(duì)象中的數(shù)據(jù)建芙。 Objective-C 對(duì)象通常會(huì)把其所需要的數(shù)據(jù)保存為各種實(shí)例變量巡通。實(shí)例變量一般通過(guò)“存取方法”(access method)來(lái)訪問。其中,“獲取方法” (getter)用于讀取變量值,而“設(shè)置方法” (setter)用于寫入變量值。這個(gè)概念已經(jīng)定型佑淀,并且經(jīng)由“屬性”這一特性而成為 Objective-C 2.0 的一部分。 而在正規(guī)的 Objective-C 編碼風(fēng)格中卷要,存取方法有著嚴(yán)格的命名規(guī)范渣聚。 正因?yàn)橛辛诉@種嚴(yán)格的命名規(guī)范独榴,所以 Objective-C 這門語(yǔ)言才能根據(jù)名稱自動(dòng)創(chuàng)建出存取方法。

也可以說(shuō):@property = getter + setter;

ivar奕枝、getter棺榔、setter 是如何生成并添加到這個(gè)類中的?

完成屬性定義后,編譯器會(huì)自動(dòng)編寫訪問這些屬性所需的方法隘道,此過(guò)程叫做“自動(dòng)合成”(autosynthesis)症歇。除了生成方法代碼 getter、setter 之外谭梗,編譯器還要自動(dòng)向類中添加適當(dāng)類型的實(shí)例變量忘晤,并且在屬性名前面加下劃線,以此作為實(shí)例變量的名字激捏。

?@protocol 和 category 中如何使用 @property

在 protocol 中使用 property 只會(huì)生成 setter 和 getter 方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對(duì)象能實(shí)現(xiàn)該屬性

category 使用 @property 也是只會(huì)生成 setter 和 getter 方法的聲明,如果我們真的需要給 category 增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù):

1设塔,objc_setAssociatedObject

2,objc_getAssociatedObject

ARC下远舅,不顯式指定任何屬性關(guān)鍵字時(shí)闰蛔,默認(rèn)的關(guān)鍵字都有哪些?

對(duì)應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是

atomic,readwrite,assign

對(duì)于普通的 Objective-C 對(duì)象

atomic,readwrite,strong


用@property聲明的NSString(或NSArray图柏,NSDictionary)經(jīng)常使用copy關(guān)鍵字序六,為什么?如果改用strong關(guān)鍵字蚤吹,可能造成什么問題例诀?

重寫帶copy關(guān)鍵字的setter方法

- ?(void)setName:(NSString *)name {

? ?_name = [name copy];

}

1,因?yàn)楦割惖闹羔樋梢灾赶蜃宇惖膶?duì)象裁着,使用copy的目的是為了讓本對(duì)象的屬性不受外界影響繁涂,使用copy無(wú)論給我傳入一個(gè)可變對(duì)象還是不可變對(duì)象,我本身持有的就是一個(gè)不可變的副本二驰。

2爆土,如果我們使用時(shí)strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部修改了氧猬,那么會(huì)影響該屬性,copy特質(zhì)所表達(dá)的所屬關(guān)系與strong類似盅抚,然而設(shè)置方法并不保留新值漠魏,而是將其拷貝妄均,當(dāng)屬性類型是NSString時(shí)哪自,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向一個(gè)NSMutableString類的實(shí)例壤巷,這個(gè)類是 NSString 的子類,表示一種可修改其值的字符串胧华,此時(shí)若是不拷貝字符串,那么設(shè)置完屬性之后宙彪,字符串的值就可能會(huì)在對(duì)象不知情的情況下遭人更改矩动。所以,這時(shí)就要拷貝一份“不可變” (immutable)的字符串释漆,確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)悲没。只要實(shí)現(xiàn)屬性所用的對(duì)象是“可變的” (mutable),就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份男图。

深復(fù)制和淺復(fù)制

1示姿,對(duì)非集合類的對(duì)象的copy和mutableCopy操作。

在非集合類對(duì)象中享言,對(duì)不可變對(duì)象進(jìn)行copy操作峻凫,是指針復(fù)制,mutableCopy操作時(shí)是內(nèi)容復(fù)制览露。對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制荧琼。

[immutableObject copy] // 淺復(fù)制

[immutableObject mutableCopy] //深復(fù)制

[mutableObject copy] //深復(fù)制

[mutableObject mutableCopy] //深復(fù)制

例如:

NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy

NSString *stringCopy = [string copy];

查看內(nèi)存,會(huì)發(fā)現(xiàn) string差牛、stringCopy 內(nèi)存地址都不一樣命锄,說(shuō)明此時(shí)都是做內(nèi)容拷貝、深拷貝偏化。即使你進(jìn)行如下操作:

[string appendString:@"origion!"]

stringCopy 的值也不會(huì)因此改變脐恩,但是如果不使用 copy,stringCopy 的值就會(huì)被改變侦讨。 集合類對(duì)象以此類推驶冒。 所以,

用 @property 聲明 NSString韵卤、NSArray骗污、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString沈条、NSMutableArray需忿、NSMutableDictionary,他們之間可能進(jìn)行賦值操作,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng)屋厘,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份涕烧。

2,對(duì)集合類的對(duì)象的copy和mutableCopy操作汗洒。

集合類對(duì)象是指 NSArray议纯、NSDictionary、NSSet ... 之類的對(duì)象仲翎。

?集合類immutable對(duì)象使用 copy 和 mutableCopy 的一個(gè)例子:

NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"]];

NSArray *copyArray = [array copy];

NSMutableArray *mCopyArray = [array mutableCopy];

查看內(nèi)存痹扇,可以看到 copyArray 和 array 的地址是一樣的,而 mCopyArray 和 array 的地址是不同的溯香。說(shuō)明 copy 操作進(jìn)行了指針拷貝鲫构,mutableCopy 進(jìn)行了內(nèi)容拷貝。但需要強(qiáng)調(diào)的是:此處的內(nèi)容拷貝玫坛,僅僅是拷貝 array 這個(gè)對(duì)象结笨,array 集合內(nèi)部的元素仍然是指針拷貝。

mutable 對(duì)象拷貝的例子:

NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];

NSArray *copyArray = [array copy];

NSMutableArray *mCopyArray = [array mutableCopy];

查看內(nèi)存湿镀,copyArray炕吸、mCopyArray和 array 的內(nèi)存地址都不一樣赫模,說(shuō)明 copyArray蒸矛、mCopyArray 都對(duì) array 進(jìn)行了內(nèi)容拷貝。同樣斩祭,我們可以得出結(jié)論

在集合類對(duì)象中摧玫,對(duì) immutable 對(duì)象進(jìn)行 copy,是指針復(fù)制诬像, mutableCopy 是內(nèi)容復(fù)制闸婴;對(duì) mutable 對(duì)象進(jìn)行 copy 和 mutableCopy 都是內(nèi)容復(fù)制。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身,對(duì)象元素仍然是指針復(fù)制溺欧。?

[immutableObject copy] // 淺復(fù)制

[immutableObject mutableCopy] //單層深復(fù)制

[mutableObject copy] //單層深復(fù)制

[mutableObject mutableCopy] //單層深復(fù)制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姐刁,隨后出現(xiàn)的幾起案子聂使,更是在濱河造成了極大的恐慌,老刑警劉巖柏靶,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屎蜓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辆苔,警方通過(guò)查閱死者的電腦和手機(jī)驻啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門荐吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沐旨,你說(shuō)我怎么就攤上這事榨婆。” “怎么了谊迄?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵统诺,是天一觀的道長(zhǎng)疑俭。 經(jīng)常有香客問我,道長(zhǎng)啄寡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任懒浮,我火速辦了婚禮砚著,結(jié)果婚禮上痴昧,老公的妹妹穿的比我還像新娘。我一直安慰自己秧骑,他們只是感情好扣囊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布侵歇。 她就那樣靜靜地躺著,像睡著了一般坟冲。 火紅的嫁衣襯著肌膚如雪溃蔫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天私痹,我揣著相機(jī)與錄音统刮,去河邊找鬼。 笑死侥蒙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鞭衩。 我是一名探鬼主播娃善,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼会放,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起御雕,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滥搭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闽坡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾嗅,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冕象,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年论悴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墓律。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡察纯,死狀恐怖捐寥,靈堂內(nèi)的尸體忽然破棺而出祖驱,到底是詐尸還是另有隱情,我是刑警寧澤捺僻,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拔稳,受9級(jí)特大地震影響锹雏,放射性物質(zhì)發(fā)生泄漏礁遵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一政勃、第九天 我趴在偏房一處隱蔽的房頂上張望兼砖。 院中可真熱鬧,春花似錦懒叛、人聲如沸戏挡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妥凳。三九已至逝钥,卻和暖如春屑那,著一層夾襖步出監(jiān)牢的瞬間持际,已是汗流浹背哗咆。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工晌柬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澈歉。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓埃难,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箱硕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 上一章:新三國(guó)之爭(zhēng)3——宋夏交戰(zhàn)(33) (三十四)新三國(guó)之爭(zhēng)4——兩王相爭(zhēng) 金朝崛起 慶歷和議之后悟衩,宋夏保持了6...
    三步一叩首閱讀 831評(píng)論 2 9
  • 1、每一個(gè)買過(guò)東西的客戶栓拜,他們的特點(diǎn)座泳、喜好,留下電話和電子郵箱幕与,具體的情況挑势,給予他們精確的咨詢,而不是無(wú)差別的群發(fā)...
    上官雨凌閱讀 349評(píng)論 0 1
  • 今天又是繁忙的一天啦鸣,自律幫助我更好的實(shí)現(xiàn)目標(biāo)潮饱。
    FineYoga蔣琳閱讀 198評(píng)論 0 0
  • 身心合一這本書說(shuō)了我們?nèi)擞?個(gè)自我,自我1是用來(lái)評(píng)價(jià)诫给,自我2是無(wú)意識(shí)的做事香拉,根據(jù)已有的經(jīng)驗(yàn)去完成當(dāng)前的任務(wù)。 有的...
    東海一舟閱讀 210評(píng)論 0 0