問題描述:
一個UIView(bView)經過alloc、init之后,add到UIView(aView)上,此時及時的對bView做了release操作。
情況一、現在又有一個UIView(cView),我要做[cView addSubview:bView];那么在此之前有沒有必要做[bView removeFromSuperview];操作?
情況二、在某種情況下(比如在按鈕的響應事件里),我需要多次執行[aView addSubview:bView];那么在每次add之前有沒有必要做remove操作?
說明:情況一和二相互獨立的,沒有聯系。
結論是:
兩種情況都不需要做remove操作。特別的情況二,如果做了remove操作,在做add操作會引起崩潰,原因是removeFromSuperview會執行release操作,此時它的retainCount已經是0了,內存會被釋放。如果把上面release放到dealloc中就不會引起崩潰了。
官方文檔做依據:
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.
個人理解:
現在有一個勺子,一個杯子,一個缸子。前提是我將勺子放入杯子中了。
情況一、我想將勺子放入缸子中,我所需要做的就是將勺子放入缸子中。因為SDK會判斷出此時勺子在杯子中,它會自動執行把勺子從杯子中拿出來的操作。
情況二、我想將勺子放入杯子中,我所需要的還是將勺子放入杯子中。因為SDK會判斷出此時勺子就在杯子中,它所執行的就是什么都不做,因為勺子已經在杯子中了。
容易混淆的概念:
這是針對同一個UIView的。還有一種情況,把bView加到aView上,此時又將cView加到aView上(bView和cView的frame相同)那么在這個時候是需要對bView做removeFromSuperview操作的。
addSubview:所執行的就是將UIView加到一個集合中,此時如果不移除bView,雖然不會造成內存泄露,但是會浪費內存,沒有必要在集合中保存bView了(特殊需求除外)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。