strong,copy,weak的區(qū)別

copy 與 strong

在日常開(kāi)發(fā)中,我們已經(jīng)習(xí)慣了一些規(guī)律挡鞍,比如字符串用copy骑歹,基本數(shù)據(jù)類(lèi)型用assign,控件用strong墨微。大多數(shù)人也知道他們的一些基本差別道媚,但是招人時(shí)候,還是很多人答不上來(lái)。自己出去面試被提問(wèn)最域,有時(shí)候也不知從何說(shuō)起谴分,今天就先總結(jié)一下。


現(xiàn)在我們現(xiàn)在開(kāi)發(fā)一般都用的ARC镀脂,我們都知道牺蹄,ARC是靠?jī)?nèi)存引用計(jì)數(shù)來(lái)管理內(nèi)存,每當(dāng)對(duì)象alloc薄翅,retain沙兰,strong,copy的時(shí)候翘魄,引用計(jì)數(shù)會(huì)加一鼎天,dealloc,頁(yè)面釋放時(shí)候會(huì)減一熟丸,引用計(jì)數(shù)為零的時(shí)候內(nèi)存便會(huì)釋放训措。

那么既然copy和strong都會(huì)讓引用計(jì)數(shù)加一,他們二者又有什么區(qū)別呢光羞,為什么我們修飾字符串時(shí)候用copy绩鸣,而在修飾控件的時(shí)候卻用strong呢?

舉個(gè)例子

現(xiàn)在有一個(gè)學(xué)校纱兑,有兩個(gè)班級(jí)呀闻。
我們先聲明兩個(gè)學(xué)生數(shù)組,一個(gè)用copy修飾潜慎,一個(gè)用strong來(lái)修飾捡多。

@interface School : NSObject
@property (strong, nonatomic) NSArray *studentArray1;
@property (copy  , nonatomic) NSArray *studentArray2;
@end

@implementation School
//省略setter方法
@end
//School調(diào)用
main(){
  NSMutableArray *students = [@[@"小明"] mutableCopy];
  School *school = [[School alloc] init];
  school.studentArray1 = students;
  school.studentArray2 = students;
  [students addObject:@"小紅"];
  NSLog(@"studentsArray1:%@",school.studentArray1);
  NSLog(@"studentsArray2:%@",school.studentArray2);

}

可以看到,我們用同一組數(shù)據(jù)分別給兩個(gè)屬性賦值铐炫, 之后再對(duì)原數(shù)組進(jìn)行修改垒手,那么打印結(jié)果是什么呢!

image.png

釋義

雖然我們都是聲明的不可變數(shù)組,但是我們給其賦值他的子類(lèi)mutableArray倒信,這時(shí)候科贬,我們修改這個(gè)可變數(shù)組。我們發(fā)現(xiàn)鳖悠, 用strong修飾的studentArray1中的元素個(gè)數(shù)發(fā)生了改變榜掌,而用copy進(jìn)行修飾的并沒(méi)有變化!

原因在與我們用strong進(jìn)行修飾的studentArray1與students指向同一塊內(nèi)存區(qū)域乘综,只是將引用計(jì)數(shù)加一操作憎账!所以當(dāng)我們修改students,studentArray1也會(huì)跟著改變卡辰!

而我們用copy修飾的studentArray2胞皱,在賦值之前邪意,會(huì)將students里的內(nèi)容拷貝一份,創(chuàng)建一個(gè)新的內(nèi)存區(qū)域反砌,所以?xún)烧卟皇且换厥鲁保瑂tudents的改變不會(huì)導(dǎo)致school.studentArray2的改變!
字符串與數(shù)組同理;


深拷貝與淺拷貝

在上面這里copy將內(nèi)容拷貝了一份就是深拷貝了于颖,淺拷貝只是將指針拷貝一份,那么copy一定是深拷貝么嚷兔?并不是森渐,這里我總結(jié)了一下

可變對(duì)象 copy 是深拷貝,會(huì)拷貝出一份新的不可變對(duì)象
不可變對(duì)象copy 是淺拷貝冒晰,只拷貝指針

關(guān)于mutableCopy

需要注意的是同衣,copy出來(lái)會(huì)將可變對(duì)象轉(zhuǎn)為不可變對(duì)象,需要copy出可變對(duì)象要用mutableCopy壶运!
mutableCopy都是深拷貝耐齐,并且copy出一份新的可變對(duì)象!

也就是用mutableCopy會(huì)copy出一份新的可變對(duì)象蒋情,并且原數(shù)組修改不會(huì)對(duì)新數(shù)組有影響埠况!

那什么時(shí)候需要用weak呢?

weak 是用來(lái)修飾需要弱引用的對(duì)象
我們最常用到的就是在block棵癣、delegate或者其他一些需要解決循環(huán)引用的問(wèn)題上
但是開(kāi)頭提到了辕翰,修飾控件一般需要用到strong,但是我們發(fā)現(xiàn)狈谊,當(dāng)使用XIB或者storyBoard的時(shí)候喜命,為我們生成的屬性都是用weak修飾的這是為什么呢!

這是因?yàn)槲覀冊(cè)谑褂肵IB的時(shí)候控件已經(jīng)放在了View上河劝,相當(dāng)于View 已經(jīng)對(duì)控件進(jìn)行了強(qiáng)引用壁榕,控件會(huì)隨View 一起釋放

我們自己手動(dòng)創(chuàng)建的控件,如果初始化后直接添加到View上赎瞎,也是可以使用weak的牌里,但是當(dāng)控件從View上remove掉的時(shí)候,就會(huì)進(jìn)行釋放煎娇!

在手動(dòng)創(chuàng)建的時(shí)候二庵,使用 weak并沒(méi)有什么特殊的優(yōu)勢(shì),相反這塊不注意寫(xiě)法的話缓呛,還容易對(duì)象會(huì)因無(wú)引用者立即被釋放催享,造成問(wèn)題。所以一般還是用strong來(lái)修飾

assign 一般用來(lái)修飾 integer哟绊,BOOL因妙,枚舉,結(jié)構(gòu)體等基本數(shù)據(jù)類(lèi)型


基本就這么多吧,以上都是個(gè)人理解攀涵,大家有更深的見(jiàn)解可以提出铣耘,共同進(jìn)步!


關(guān)于深拷貝與淺拷貝還需要補(bǔ)充一點(diǎn)
自定義對(duì)象的copy都是copy的指針以故,比如數(shù)組中有一個(gè)自定義對(duì)象蜗细,再將數(shù)組賦值給另一個(gè)數(shù)組,那么改變其中一個(gè)數(shù)組中的對(duì)象怒详,另一個(gè)對(duì)象也會(huì)跟著變炉媒,解決這一點(diǎn)需要在自定義對(duì)象遵循copying協(xié)議,實(shí)現(xiàn)copyWithZone方法昆烁,才能實(shí)現(xiàn)深拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吊骤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子静尼,更是在濱河造成了極大的恐慌白粉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼠渺,死亡現(xiàn)場(chǎng)離奇詭異鸭巴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拦盹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)奕扣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掌敬,你說(shuō)我怎么就攤上這事惯豆。” “怎么了奔害?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楷兽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我华临,道長(zhǎng)芯杀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任雅潭,我火速辦了婚禮揭厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扶供。我一直安慰自己筛圆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布椿浓。 她就那樣靜靜地躺著太援,像睡著了一般闽晦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上提岔,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天仙蛉,我揣著相機(jī)與錄音,去河邊找鬼碱蒙。 笑死荠瘪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赛惩。 我是一名探鬼主播巧还,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坊秸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起澎怒,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褒搔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喷面,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體星瘾,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年惧辈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳状。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒齿,死狀恐怖念逞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情边翁,我是刑警寧澤翎承,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站符匾,受9級(jí)特大地震影響叨咖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啊胶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一甸各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焰坪,春花似錦趣倾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)部凑。三九已至,卻和暖如春碧浊,著一層夾襖步出監(jiān)牢的瞬間涂邀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工箱锐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留比勉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓驹止,卻偏偏與公主長(zhǎng)得像浩聋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臊恋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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