iOS內(nèi)存管理:屬性修飾符Strong和Copy

ARC是通過編譯器自動(dòng)加入Retain盒让、Copy和Release等方法調(diào)用來實(shí)現(xiàn)內(nèi)存管理搜锰,仍然以引用計(jì)數(shù)為基礎(chǔ)。

1. Strong和Copy的區(qū)別

依據(jù)ARC的實(shí)現(xiàn)原理身坐,屬性被Strong或Copy修飾決定在其Setter方法中調(diào)用Retain還是Copy秸脱。

//使用strong修飾的strongString屬性的Setter方法
- (void)setStrongString:(NSMutableString *)strongString
{
    if (strongString != _strongString) {
        [_strongString release];
        _strongString = [strongString retain];
    }
}
//使用copy修飾的copytoString屬性的Setter方法
- (void)setCopytoString:(NSMutableString *)copytoString
{
    if (copytoString != _copytoString) {
        [_copytoString release];
        _copytoString = [copytoString copy];
    }
}
2. Strong和Copy在什么情況下使用

(1) Strong
strong一般用于非容器類對(duì)象。會(huì)增加引用計(jì)數(shù)部蛇。相當(dāng)與Mrc中的Retain摊唇。
(2)Copy
copy用于容器類對(duì)象,比如NSString涯鲁、NSArray巷查、NSDictionary,或其他實(shí)現(xiàn)NSCopying抹腿、NSMutableCopying協(xié)議的對(duì)象岛请。對(duì)于Setter傳入對(duì)象為不可變對(duì)象時(shí),功能與strong相同警绩。對(duì)于Setter方法傳入對(duì)象為可變對(duì)象時(shí)崇败,會(huì)進(jìn)行深拷貝,不增加引用計(jì)數(shù)肩祥。

3. 測(cè)試實(shí)例和結(jié)果
//聲明兩個(gè)String類型的屬性后室,一個(gè)用strong修飾微渠,一個(gè)用copy修飾
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copytoString;

//賦值值類型為可變對(duì)象
- (void)test
{
    NSMutableString *str = [NSMutableString stringWithFormat:@"123"];
    NSLog(@"初始str = %@ p = %p &p = %p",str,str,&str);
    
    self.copytoString = str;
    self.strongString = str;
    
    [str appendString:@"123"];
    NSLog(@"拼接后str = %@ p = %p &p = %p",str,str,&str);
    
    NSLog(@"copytoString = %@ p = %p class = %@",self.copytoString,_copytoString,NSStringFromClass([_copytoString class]));
    NSLog(@"strongString = %@ p = %p class = %@",self.strongString,_strongString,NSStringFromClass([_strongString class]));
}
//可見copy生成了新的內(nèi)存空間,而strong沒有咧擂,修改了原對(duì)象值后逞盆,strong修飾的屬性值也變了。
str = 123 p = 0x60400044dcb0 &p = 0x7ffeeeb61ee8
str = 123123 p = 0x60400044dcb0 &p = 0x7ffeeeb61ee8
copytoString = 123 p = 0xa000000003332313 class = NSTaggedPointerString
strongString = 123123 p = 0x60400044dcb0 class = __NSCFString

給屬性賦值不可變類型值

- (void)test2
{
    NSString *str = @"123";
    NSLog(@"str = %@ p = %p &p = %p",str,str,&str);
    self.copytoString = str;
    self.strongString = str;
    
    NSLog(@"copytoString = %@ p = %p class = %@",self.copytoString,_copytoString,NSStringFromClass([_copytoString class]));
    NSLog(@"strongString = %@ p = %p class = %@",self.strongString,_strongString,NSStringFromClass([_strongString class]));
}

輸出結(jié)果

str = 123 p = 0x10eea1078 &p = 0x7ffee0d5dee8
copytoString = 123 p = 0x10eea1078 class = __NSCFConstantString
strongString = 123 p = 0x10eea1078 class = __NSCFConstantString

由測(cè)試可見松申,給屬性賦于值的對(duì)象類型為不可變類型時(shí)云芦,Strong和Copy效果一樣,淺拷貝贸桶,增加引用計(jì)數(shù)舅逸。賦值的對(duì)象類型為可變類型時(shí),Strong修飾的屬性會(huì)淺拷貝皇筛,增加引用計(jì)數(shù)琉历,Copy修飾的屬性會(huì)深拷貝,不增加引用計(jì)數(shù)水醋。

4. 相關(guān)知識(shí):深拷貝旗笔,淺拷貝

淺拷貝 淺拷貝就是復(fù)制指向?qū)ο蟮闹羔槨?br> retain、strong拄踪、不可變對(duì)象的copy都屬于淺拷貝蝇恶。

深拷貝 深拷貝就是拷貝對(duì)象本身。
可變對(duì)象的copy 和mutableCopy 是深拷貝惶桐。

而weak和unsafe_unretain應(yīng)該也屬于淺拷貝撮弧,不過不增加引用計(jì)數(shù)。最后這個(gè)是自己猜的姚糊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贿衍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子救恨,更是在濱河造成了極大的恐慌贸辈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿薇,死亡現(xiàn)場(chǎng)離奇詭異裙椭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揉燃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筋栋,你說我怎么就攤上這事炊汤。” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵抢腐,是天一觀的道長姑曙。 經(jīng)常有香客問我,道長迈倍,這世上最難降的妖魔是什么伤靠? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮啼染,結(jié)果婚禮上宴合,老公的妹妹穿的比我還像新娘。我一直安慰自己迹鹅,他們只是感情好卦洽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斜棚,像睡著了一般阀蒂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弟蚀,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天蚤霞,我揣著相機(jī)與錄音,去河邊找鬼粗梭。 笑死争便,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的断医。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼奏纪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鉴嗤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起序调,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤醉锅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后发绢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬耍,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年边酒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了经柴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墩朦,死狀恐怖坯认,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤牛哺,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布陋气,位于F島的核電站,受9級(jí)特大地震影響引润,放射性物質(zhì)發(fā)生泄漏巩趁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一淳附、第九天 我趴在偏房一處隱蔽的房頂上張望议慰。 院中可真熱鬧,春花似錦燃观、人聲如沸褒脯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽番川。三九已至,卻和暖如春脊框,著一層夾襖步出監(jiān)牢的瞬間颁督,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工浇雹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉御,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓昭灵,卻偏偏與公主長得像吠裆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烂完,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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