您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android中如何實(shí)現(xiàn)垃圾回收”,在日常操作中,相信很多人在Android中如何實(shí)現(xiàn)垃圾回收問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android中如何實(shí)現(xiàn)垃圾回收”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
首先所有的類都會(huì)虛繼承refbase類,因?yàn)樗鼘?shí)現(xiàn)了達(dá)到Android垃圾回收所需要的所有function,因此實(shí)際上所有的對象聲明出來以后都具備了自動(dòng)釋放自己的能力,也就是說實(shí)際上智能指針就是我們的對象本身,它會(huì)維持一個(gè)對本身強(qiáng)引用和弱引用的計(jì)數(shù),一旦強(qiáng)引用計(jì)數(shù)為0它就會(huì)釋放掉自己。
首先我們看sp,sp實(shí)際上不是smart pointer的縮寫,而是strong pointer,它實(shí)際上內(nèi)部就包含了一個(gè)指向?qū)ο蟮闹羔樁?。我們可以簡單看看sp的一個(gè)構(gòu)造函數(shù):
template< typename T> sp< T>::sp(T* other) : m_ptr(other) { if (other) other->incStrong(this); }
比如說我們聲明一個(gè)對象:
sp< CameraHardwareInterface> hardware(new CameraHal());
實(shí)際上sp指針對本身沒有進(jìn)行什么操作,就是一個(gè)指針的賦值,包含了一個(gè)指向?qū)ο蟮闹羔?,但是對象?huì)對對象本身增加一個(gè)強(qiáng)引用計(jì)數(shù),這個(gè) incStrong的實(shí)現(xiàn)就在refbase類里面。新new出來一個(gè)CameraHal對象,將它的值給 sp< CameraHardwareInterface>的時(shí)候,它的強(qiáng)引用計(jì)數(shù)就會(huì)從0變?yōu)?。因此每次將對象賦值給一個(gè)sp指針的時(shí)候,對象的強(qiáng)引用計(jì)數(shù)都會(huì)加1,下面我們再看看sp的析構(gòu)函數(shù):
template< typename T> sp< T>::~sp() { if (m_ptr) m_ptr->decStrong(this); }
實(shí)際上每次delete一個(gè)sp對象的時(shí)候,sp指針指向的對象的強(qiáng)引用計(jì)數(shù)就會(huì)減一,當(dāng)對象的強(qiáng)引用技術(shù) 為0的時(shí)候這個(gè)對象就會(huì)被自動(dòng)釋放掉。
我們再看wp,wp就是weak pointer的縮寫,弱引用指針的原理 ,就是為了應(yīng)用Android垃圾回收來減少對那些胖子對象對內(nèi)存的占用,我們首先來看wp的一個(gè)構(gòu)造函數(shù):
wp< T>::wp(T* other) : m_ptr(other) { if (other) m_refs = other->createWeak(this); }
它和sp一樣實(shí)際上也就是僅僅對指針進(jìn)行了賦值而已,對象本身會(huì)增加一個(gè)對自身的弱引用計(jì)數(shù),同時(shí)wp還包含一個(gè)m_ref指針,這個(gè)指針主要是用來將wp升級為sp時(shí)候使用的:
template< typename T> sp< T> wp< T>::promote() const { return sp< T>(m_ptr, m_refs); } template< typename T> sp< T>::sp(T* p, weakref_type* refs) : m_ptr((p && refs->attemptIncStrong(this)) ? p : 0) { }
實(shí)際上我們對wp指針***能做的就是將wp指針升級為一個(gè)sp指針,然后判斷是否升級成功,如果成功說明對象依舊存在,如果失敗說明對象已經(jīng)被釋放掉了。wp指針我現(xiàn)在看到的是在單例中使用很多,確保mhardware對象只有一個(gè),比如:
wp< CameraHardwareInterface> CameraHardwareStub::singleton; sp< CameraHardwareInterface> CameraHal::createInstance() { LOG_FUNCTION_NAME if (singleton != 0) { sp< CameraHardwareInterface> hardware = singleton.promote(); if (hardware != 0) { return hardware; } } sp< CameraHardwareInterface> hardware(new CameraHal()); //強(qiáng)引用加1 singleton = hardware;//弱引用加1 return hardware;//賦值構(gòu)造函數(shù),強(qiáng)引用加1 } //hardware被刪除,強(qiáng)引用減1
到此,關(guān)于“Android中如何實(shí)現(xiàn)垃圾回收”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。