ViewController中的UIView Property要設置為weak還是strong

眾所周知臀叙,從IB中拖出來的outlet Xcode會默認設置為weak笆豁,那么代碼new出來并且addSubview到self.view的view郎汪,我們在property里要設置為strong還是weak呢。

Weak or Strong?

假設一個ViewController的self.view中有一個Label闯狱,那么他們三者的關系是:


圖1

可以看到Label的所有者其實是self.view煞赢,正常來說一個對象只有一個所有者,如果再將ViewController中的Label引用聲明為strong哄孤,那么當label從self.view中移除后照筑,label將不會銷毀,造成View的冗余。

于是我們愉快地把Label聲明為weak凝危,但是在初始化label的時候饭弓,Xcode又猝不及防地扔給我們一個warning。

咦媒抠,我們addSubview之后self.label不是已經(jīng)被self.view強引用了嘛,這又是什么鬼為什么Xcode還跟我們說都是weak惹的禍這個對象馬上就要被釋放了咏花。編譯一下試試趴生,發(fā)現(xiàn)ViewController里面果然一片雪白,完全沒有剛剛加進去的label的影子昏翰,看來Xcode沒有騙我們苍匆。

Label消失的原因

我們來逐步分析一下這幾句話背后引用計數(shù)的變化:

self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

這句話其實應該拆成兩句話,首先alloc出了一個UILabel的臨時變量棚菊,然后再使用setLabel將臨時變量復制給self.label浸踩。其中引用計數(shù)變化如下

id temp = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];? ? ? //tempLabel引用計數(shù)為1

[self setLabel: temp];? ? ? ? ? //由于self.label是weak,因此此處引用計數(shù)還是1

然后接下來的代碼中沒有再用到temp,temp被釋放统求,此時引用計數(shù)為0检碗,temp被設為nil,于是self.label也被設為nil

[temp release];? ? ? ? //引用計數(shù)變?yōu)?

最后addSubview時只add了一個nil的view码邻,引用計數(shù)并不能增加折剃,所以我們在運行時才沒有看到new出來的label。

[self.view addSubview:self.label];? ? ? ? ? ? ? //此處等于[self.view addSubview:nil];

正確的打開方式

正確的打開方式是先用一個臨時變量把init出來的變量hold住像屋,防止temp在執(zhí)行的過程中被釋放怕犁,先亮代碼:

UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

self.label = tempLabel;

self.label = @"Hello World";

[self.view addSubview:self.label];

這段話的引用計數(shù)過程是

UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

這句話可以拆成兩句

id temp = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];? ? ? ? ? //temp引用計數(shù)為1

UILabel *tempLabel = temp;? ? ? ? ? //局部變量默認是strong,temp引用計數(shù)增至2

self.label = tempLabel;? ? ? ? //self.label是weak,不改變引用計數(shù)

self.label = @"Hello World";

[self.view addSubview:self.label];? ? ? ? ? //引用計數(shù)+1己莺,temp的引用計數(shù)為3

//這段代碼執(zhí)行完后奏甫,臨時變量將被釋放

[tempLabel release];? ? ? ? //temp引用計數(shù)為2

[temp release];? ? ? ? ? ? //temp引用計數(shù)為1

整段話執(zhí)行完后,既保證了temp在執(zhí)行過程中過早釋放凌受,又保證了在執(zhí)行完后temp的引用計數(shù)為1阵子,因此是初始化UIView的property較為科學的方法。

本文是從一個大牛的微博里拷貝過來的胁艰,主要是為了以后看方便款筑。他微博里有很多好文章

可以關注一下

原文鏈接?iOS 入門級攻城尸的微博

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腾么,隨后出現(xiàn)的幾起案子奈梳,更是在濱河造成了極大的恐慌,老刑警劉巖解虱,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攘须,死亡現(xiàn)場離奇詭異,居然都是意外死亡殴泰,警方通過查閱死者的電腦和手機于宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門浮驳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捞魁,你說我怎么就攤上這事至会。” “怎么了谱俭?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵奉件,是天一觀的道長。 經(jīng)常有香客問我昆著,道長县貌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任凑懂,我火速辦了婚禮煤痕,結果婚禮上,老公的妹妹穿的比我還像新娘接谨。我一直安慰自己摆碉,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布脓豪。 她就那樣靜靜地躺著兆解,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跑揉。 梳的紋絲不亂的頭發(fā)上锅睛,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音历谍,去河邊找鬼现拒。 笑死,一個胖子當著我的面吹牛望侈,可吹牛的內容都是我干的印蔬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脱衙,長吁一口氣:“原來是場噩夢啊……” “哼侥猬!你這毒婦竟也來了?” 一聲冷哼從身側響起捐韩,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤退唠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荤胁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧预,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垢油。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆驹。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滩愁,靈堂內的尸體忽然破棺而出躯喇,到底是詐尸還是另有隱情,我是刑警寧澤硝枉,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布玖瘸,位于F島的核電站,受9級特大地震影響檀咙,放射性物質發(fā)生泄漏。R本人自食惡果不足惜璃诀,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一弧可、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劣欢,春花似錦棕诵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牧抵,卻和暖如春笛匙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犀变。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工妹孙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人获枝。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓蠢正,卻偏偏與公主長得像,于是被迫代替她去往敵國和親省店。 傳聞我的和親對象是個殘疾皇子嚣崭,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容