iOS 內(nèi)存管理語義中的 Strong 與 Copy

開發(fā)中使用屬性很頻繁,常見的屬性內(nèi)存管理語義主要有 strong、copy狭郑、weak腹暖、assign,本次主要介紹下 strong 和 copy愿阐。如果你了解了深淺拷貝微服,那這部分內(nèi)容應(yīng)該很容易理解;深淺拷貝的內(nèi)容可參考:iOS 你不一定了解的深淺拷貝

可以通過這樣一個場景缨历,理解 strong 和 copy 的本質(zhì)區(qū)別:
  • 創(chuàng)建一個 Person 類以蕴,聲明兩個屬性,一個用 strong辛孵,另外一個用 copy;
#import <Foundation/Foundation.h>

@interface CHIPerson : NSObject

@property (nonatomic, strong) NSString *chi_strongName;
@property (nonatomic, copy) NSString *chi_copyName;

@end
  • 下面在代碼中使用這個類丛肮,并對屬性賦值
    NSString *string = @"123456";
    NSLog(@"\nstring : %@-%p\n\n", string, string);
    
    CHIPerson *person = [[CHIPerson alloc] init];
    person.chi_strongName = string;
    person.chi_copyName = string;
    
    NSLog(@"\nstrong : %@-%p\ncopy : %@-%p\n\n", person.chi_strongName, person.chi_strongName, person.chi_copyName, person.chi_copyName);
    
    // 改變字符串的內(nèi)容
    string = @"789";
    
    NSLog(@"\nstrong : %@-%p\ncopy : %@-%p\n\n", person.chi_strongName, person.chi_strongName, person.chi_copyName, person.chi_copyName);
    NSLog(@"\nstring : %@-%p", string, string);
  • 控制臺打印結(jié)果
打印內(nèi)容及地址

打印結(jié)果顯示,使用 strong 和 copy 的屬性內(nèi)容相同魄缚,指向同一處內(nèi)存區(qū)域缔御,不可變字符串在重新賦值后榨汤,指向新的內(nèi)存區(qū)域,對兩個屬性值沒有什么影響;

到這里還沒有看出 strong 與 copy 有什么不同之處培遵,下面換種方式:
  • 不可變字符串換成可變字符串
    NSMutableString *mutString = [NSMutableString stringWithFormat:@"123456"];
    NSLog(@"\nstring : %@-%p\n\n", mutString, mutString);
    
    CHIPerson *person = [[CHIPerson alloc] init];
    person.chi_strongName = mutString;
    person.chi_copyName = mutString;
    
    NSLog(@"\nstrong : %@-%p\ncopy : %@-%p\n\n", person.chi_strongName, person.chi_strongName, person.chi_copyName, person.chi_copyName);
    
    // 改變可變字符串的內(nèi)容
    [mutString appendString:@"789"];
    
    NSLog(@"\nstrong : %@-%p\ncopy : %@-%p\n\n", person.chi_strongName, person.chi_strongName, person.chi_copyName, person.chi_copyName);
    NSLog(@"\nstring : %@-%p", mutString, mutString);
  • 再看控制臺打印結(jié)果
打印內(nèi)容及地址

這里就有明顯的不同了村砂,打印結(jié)果顯示保屯,使用 strong 的屬性內(nèi)容及地址與可變字符串保持一致辜膝,但是使用 copy 關(guān)鍵字的屬性內(nèi)容雖然相同,地址已經(jīng)改變了飞蛹;更改可變字符串的值后谤狡,strong 關(guān)鍵字的屬性值跟著發(fā)生了變化,而 copy 關(guān)鍵字的屬性值依然保持不變卧檐;

為什么會出現(xiàn)這樣差異墓懂,實(shí)際上,使用 copy 關(guān)鍵字的屬性霉囚,在做賦值操作的時候捕仔,會在 setter 方法中做一次 copy 操作:
- (void)setChi_copyName:(NSString *)chi_copyName
{
    _chi_copyName = [chi_copyName copy];
}

這就是為什么很多有可變類型的屬性,要使用 copy 關(guān)鍵字盈罐;copy 關(guān)鍵字的屬性在做賦值操作時逻澳,不管傳入的類型是可變的還是不可變的,屬性本身相當(dāng)于持有一份不可變的副本暖呕,外部變量值更改時,不會對屬性產(chǎn)生影響苞氮,這樣可以有效保證屬性的封裝性湾揽;

這與深淺拷貝的原理是保持一致的:對不可變對象的 copy 操作,是淺拷貝;對可變對象的 copy 操作库物,是深拷貝霸旗;

到這里我們可以大膽做下嘗試,對 strong 關(guān)鍵字的屬性戚揭,實(shí)現(xiàn) copy 的特性诱告,即重寫 setter 方法:
- (void)setChi_strongName:(NSString *)chi_strongName
{
    _chi_strongName = [chi_strongName copy];
}
  • 再看控制臺打印結(jié)果
重寫 strong 的 setter

可以看出,strong 關(guān)鍵字聲明的屬性也有了 copy 的特性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民晒,一起剝皮案震驚了整個濱河市精居,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潜必,老刑警劉巖靴姿,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磁滚,居然都是意外死亡佛吓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門垂攘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來维雇,“玉大人,你說我怎么就攤上這事晒他≈ㄐ停” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵仪芒,是天一觀的道長唁影。 經(jīng)常有香客問我,道長掂名,這世上最難降的妖魔是什么据沈? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饺蔑,結(jié)果婚禮上锌介,老公的妹妹穿的比我還像新娘。我一直安慰自己猾警,他們只是感情好孔祸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著发皿,像睡著了一般崔慧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穴墅,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天惶室,我揣著相機(jī)與錄音温自,去河邊找鬼。 笑死皇钞,一個胖子當(dāng)著我的面吹牛悼泌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹界,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馆里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了可柿?” 一聲冷哼從身側(cè)響起鸠踪,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趾痘,沒想到半個月后慢哈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡永票,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年卵贱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣集。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡键俱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出世分,到底是詐尸還是另有隱情编振,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布臭埋,位于F島的核電站踪央,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓢阴。R本人自食惡果不足惜畅蹂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣恐。 院中可真熱鬧液斜,春花似錦、人聲如沸叠穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼被。三九已至示损,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚷硫,已是汗流浹背屎媳。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工夺溢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烛谊。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嘉汰,于是被迫代替她去往敵國和親丹禀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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

  • 今天的天氣是暖和的鞋怀,不像前幾天那樣的冷双泪,除了床哪里都是遠(yuǎn)方。今天是周末密似,陽光那么溫和焙矛,照得人的心理暖暖的。因?yàn)榉泵?..
    哇好好7閱讀 192評論 0 0
  • git clone remote_address //克隆倉庫 git add file // 將文件從works...
    wMeSlAx767閱讀 281評論 0 0
  • 一陣清香残腌,一口酸甜村斟,一種脆軟。 多久都沒有這樣的感覺了抛猫,今日重溫蟆盹,難免心動。在秋天到來時闺金,桔子將熟未熟逾滥,貪...
    thundering閱讀 277評論 0 0