iOS 說明并比較關(guān)鍵詞:strong, weak, assign, copy等等


strong表示指向并擁有該對(duì)象讹躯。其修飾的對(duì)象引用計(jì)數(shù)會(huì)增加1。該對(duì)象只要引用計(jì)數(shù)不為0則不會(huì)被銷毀凶异。當(dāng)然強(qiáng)行將其設(shè)為nil可以銷毀它蜀撑。

weak表示指向但不擁有該對(duì)象。其修飾的對(duì)象引用計(jì)數(shù)不會(huì)增加剩彬。無需手動(dòng)設(shè)置酷麦,該對(duì)象會(huì)自行在內(nèi)存中銷毀。

assign主要用于修飾基本數(shù)據(jù)類型喉恋,如NSInteger和CGFloat沃饶,這些數(shù)值主要存在于棧上。

weak 一般用來修飾對(duì)象轻黑,assign一般用來修飾基本數(shù)據(jù)類型糊肤。原因是assign修飾的對(duì)象被釋放后,指針的地址依然存在氓鄙,造成野指針馆揉,在堆上容易造成崩潰。而棧上的內(nèi)存系統(tǒng)會(huì)自動(dòng)處理抖拦,不會(huì)造成野指針升酣。

copy與strong類似。不同之處是strong的復(fù)制是多個(gè)指針指向同一個(gè)地址态罪,而copy的復(fù)制每次會(huì)在內(nèi)存中拷貝一份對(duì)象噩茄,指針指向不同地址。copy一般用在修飾有可變對(duì)應(yīng)類型的不可變對(duì)象上复颈,如NSString, NSArray, NSDictionary绩聘。

Objective-C 中,基本數(shù)據(jù)類型的默認(rèn)關(guān)鍵字是atomic, readwrite, assign耗啦;普通屬性的默認(rèn)關(guān)鍵字是atomic, readwrite, strong凿菩。


1、屬性readwrite帜讲,readonly衅谷,assign,retain舒帮,copy会喝,nonatomic 各自什么作用陡叠,他們?cè)谀欠N情況下用?


    readwrite:默認(rèn)的屬性,可讀可寫肢执,生成setter和getter方法枉阵。

    readonly:只讀,只生成getter方法预茄,也就是說不能修改變量兴溜。

    assign:用于聲明基本數(shù)據(jù)類型(int、float)僅設(shè)置變量耻陕,是賦值屬性拙徽。

    retain:持有屬性,setter方法將傳入的參數(shù)先保留,再賦值,傳入的參數(shù) 引用計(jì)數(shù)retaincount 會(huì)加1

在堆上開辟一塊空間诗宣,用指針a指向膘怕,然后將指針a賦值(assign)給指針b,等于是a和b同時(shí)指向這塊堆空間召庞,當(dāng)a不使用這塊堆空間的時(shí)候岛心,是否要釋放這塊堆空間?答案是肯定要的篮灼,但是這件堆空間被釋放后忘古,b就成了野指針。

如何避免這樣的問題诅诱? 這就引出了引用計(jì)數(shù)器髓堪,當(dāng)a指針這塊堆空間的時(shí)候,引用計(jì)數(shù)器+1娘荡,當(dāng)b也指向的時(shí)候干旁,引用計(jì)數(shù)器變成了2,當(dāng)a不再指向這塊堆空間時(shí)它改,release-1疤孕,引用計(jì)數(shù)器為1商乎,當(dāng)b也不指向這塊堆空間時(shí)央拖,release-1,引用計(jì)數(shù)器為0鹉戚,調(diào)用dealloc函數(shù)鲜戒,空間被釋放

總結(jié):當(dāng)數(shù)據(jù)類型為int,float原生類型時(shí)抹凳,可以使用assign遏餐。如果是上面那種情況(對(duì)象)就是用retain。

copy:是賦值特性,setter方法將傳入對(duì)象賦值一份;需要完全一份新的變量時(shí),直接從堆區(qū)拿赢底。

當(dāng)屬性是 NSString失都、NSArray柏蘑、NSDictionary時(shí),既可以用strong 修飾粹庞,也可以用copy修飾咳焚。當(dāng)用strong修飾的NSString 指向一個(gè)NSMutableString時(shí),如果在不知情的情況下這個(gè)NSMutableString的別的引用修改了值庞溜,就會(huì)出現(xiàn):一個(gè)不可變的字符串卻被改變了的情況革半, 使用copy就不會(huì)出現(xiàn)這種情況。

 nonatomic:非原子性流码,可以多線程訪問又官,效率高。

atomic:原子性漫试,屬性安全級(jí)別的表示六敬,同一時(shí)刻只有一個(gè)線程訪問,具有資源的獨(dú)占性驾荣,但是效率很低觉阅。

strong:強(qiáng)引用,引用計(jì)數(shù)+ 1秘车,ARC下典勇,一個(gè)對(duì)象如果沒有強(qiáng)引用,系統(tǒng)就會(huì)釋放這個(gè)對(duì)象叮趴。

weak:弱引用割笙,不會(huì)使引用計(jì)數(shù)+1.當(dāng)一個(gè)指向?qū)ο蟮膹?qiáng)引用都被釋放時(shí),這塊空間依舊會(huì)被釋放掉眯亦。

使用場(chǎng)景:在ARC下伤溉,如果使用XIB 或者SB 來創(chuàng)建控件,就使用 weak妻率。純代碼創(chuàng)建控件時(shí)乱顾,用strong修飾,如果想用weak 修飾宫静,就需要先創(chuàng)建控件走净,然后賦值給用weak修飾的對(duì)象。

查找了一些資料孤里,發(fā)現(xiàn)主要原因是伏伯,controller需要擁有它自己的view(這個(gè)view是所以子控件的父view),因此viewcontroller對(duì)view就必須是強(qiáng)引用(strong reference),得用strong修飾view捌袜。對(duì)于lable说搅,它的父view是view,view需要擁有l(wèi)abel虏等,但是controller是不需要擁有l(wèi)abel的弄唧。如果用strong修飾适肠,在view銷毀的情況下,label還仍然占有內(nèi)存候引,因?yàn)閏ontroller還對(duì)它強(qiáng)引用迂猴;如果用wak修飾,在view銷毀的時(shí)label的內(nèi)存也同時(shí)被銷毀背伴,避免了僵尸指針出現(xiàn)沸毁。

用引用計(jì)數(shù)回答就是:因?yàn)镃ontroller并不直接“擁有”控件,控件由它的父view“擁有”傻寂。使用weak關(guān)鍵字可以不增加控件引用計(jì)數(shù)息尺,確保控件與父view有相同的生命周期疾掰÷в控件在被addSubview后,相當(dāng)于控件引用計(jì)數(shù)+1静檬;父view銷毀后炭懊,所有的子view引用計(jì)數(shù)-1,則可以確保父view銷毀時(shí)子view立即銷毀拂檩。weak的控件在removeFromSuperview后也會(huì)立即銷毀侮腹,而strong的控件不會(huì),因?yàn)镃ontroller還保有控件強(qiáng)引用稻励。

總結(jié)歸納為:當(dāng)控件的父view銷毀時(shí)父阻,如果你還想繼續(xù)擁有這個(gè)控件,就用srtong望抽;如果想保證控件和父view擁有相同的生命周期加矛,就用weak。當(dāng)然在大多數(shù)情況下用兩個(gè)都是可以的煤篙。

使用weak的時(shí)候需要特別注意的是:先將控件添加到superview上之后再賦值給self斟览,避免控件被過早釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辑奈,一起剝皮案震驚了整個(gè)濱河市苛茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身害,老刑警劉巖味悄,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草戈,死亡現(xiàn)場(chǎng)離奇詭異塌鸯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唐片,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丙猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨颜,“玉大人,你說我怎么就攤上這事茧球⊥ス澹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵抢埋,是天一觀的道長(zhǎng)弹灭。 經(jīng)常有香客問我,道長(zhǎng)揪垄,這世上最難降的妖魔是什么穷吮? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮饥努,結(jié)果婚禮上捡鱼,老公的妹妹穿的比我還像新娘。我一直安慰自己酷愧,他們只是感情好驾诈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溶浴,像睡著了一般乍迄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上士败,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天就乓,我揣著相機(jī)與錄音,去河邊找鬼拱烁。 笑死生蚁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戏自。 我是一名探鬼主播邦投,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼擅笔!你這毒婦竟也來了志衣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤猛们,失蹤者是張志新(化名)和其女友劉穎念脯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯淘,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绿店,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假勿。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡借嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出转培,到底是詐尸還是另有隱情恶导,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布浸须,位于F島的核電站惨寿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏删窒。R本人自食惡果不足惜缤沦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望易稠。 院中可真熱鬧缸废,春花似錦、人聲如沸驶社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡电。三九已至届巩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間份乒,已是汗流浹背恕汇。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留或辖,地道東北人瘾英。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颂暇,于是被迫代替她去往敵國(guó)和親缺谴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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