溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS UIView的addSubview:和removeFromSuperview方法

發(fā)布時(shí)間:2020-06-28 02:24:10 來源:網(wǎng)絡(luò) 閱讀:1004 作者:李遠(yuǎn)超0317 欄目:移動(dòng)開發(fā)

問題描述:

   一個(gè)UIView(bView)經(jīng)過alloc、init之后,add到UIView(aView)上,此時(shí)及時(shí)的對(duì)bView做了release操作。

   情況一、現(xiàn)在又有一個(gè)UIView(cView),我要做[cView addSubview:bView];那么在此之前有沒有必要做[bView removeFromSuperview];操作?

   情況二、在某種情況下(比如在按鈕的響應(yīng)事件里),我需要多次執(zhí)行[aView addSubview:bView];那么在每次add之前有沒有必要做remove操作?

       說明:情況一和二相互獨(dú)立的,沒有聯(lián)系。

結(jié)論是:

   兩種情況都不需要做remove操作。特別的情況二,如果做了remove操作,在做add操作會(huì)引起崩潰,原因是removeFromSuperview會(huì)執(zhí)行release操作,此時(shí)它的retainCount已經(jīng)是0了,內(nèi)存會(huì)被釋放。如果把上面release放到dealloc中就不會(huì)引起崩潰了。

官方文檔做依據(jù):

   If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

個(gè)人理解:

   現(xiàn)在有一個(gè)勺子,一個(gè)杯子,一個(gè)缸子。前提是我將勺子放入杯子中了。

   情況一、我想將勺子放入缸子中,我所需要做的就是將勺子放入缸子中。因?yàn)镾DK會(huì)判斷出此時(shí)勺子在杯子中,它會(huì)自動(dòng)執(zhí)行把勺子從杯子中拿出來的操作。

   情況二、我想將勺子放入杯子中,我所需要的還是將勺子放入杯子中。因?yàn)镾DK會(huì)判斷出此時(shí)勺子就在杯子中,它所執(zhí)行的就是什么都不做,因?yàn)樯鬃右呀?jīng)在杯子中了。

容易混淆的概念:

   這是針對(duì)同一個(gè)UIView的。還有一種情況,把bView加到aView上,此時(shí)又將cView加到aView上(bView和cView的frame相同)那么在這個(gè)時(shí)候是需要對(duì)bView做removeFromSuperview操作的。

   addSubview:所執(zhí)行的就是將UIView加到一個(gè)集合中,此時(shí)如果不移除bView,雖然不會(huì)造成內(nèi)存泄露,但是會(huì)浪費(fèi)內(nèi)存,沒有必要在集合中保存bView了(特殊需求除外)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI