九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android RefBase類(sp,wp)

        個人覺得sp和wp實際上就是android為其c++實現(xiàn)的垃圾自動回收機制,具體到內(nèi)部實現(xiàn),sp和wp實際上只是一個實現(xiàn)垃圾回收功能的接口而已,比如說對*,->的重載,是為了其看起來跟真正的指針一樣,而真正實現(xiàn)垃圾回收的是RefBase這個基類。這部分代碼的目錄在:/frameworks/base/include/utils/RefBase.h
        首先所有的類都會虛繼承RefBase類,因為它實現(xiàn)了達到垃圾回收所需要的所有function,因此實際上所有的對象聲明出來以后都具備了自動釋放自己的能力,也就是說實際上智能指針就是我們的對象本身,它會維持一個對本身強引用和弱引用的計數(shù),一旦強引用計數(shù)為0它就會釋放掉自己。
      首先我們看sp,sp實際上不是smart pointer的縮寫,而是strong pointer,它實際上內(nèi)部就包含了一個指向?qū)ο蟮闹羔樁选N覀兛梢院唵慰纯磗p的一個構(gòu)造函數(shù):

    

  1. template<typename T>  
  2. sp<T>::sp(T* other)  
  3.     : m_ptr(other)  
  4. {  
  5.     if (other) other->incStrong(this);  
  6. }  

 

    比如說我們聲明一個對象:
    sp<CameraHardwareInterface> hardware(new CameraHal());
    實際上sp指針對本身沒有進行什么操作,就是一個指針的賦值,包含了一個指向?qū)ο蟮闹羔槪菍ο髸ο蟊旧碓黾右粋€強引用計數(shù),這個 incStrong的實現(xiàn)就在RefBase類里面。新new出來一個CameraHal對象,將它的值給 sp<CameraHardwareInterface>的時候,它的強引用計數(shù)就會從0變?yōu)?。因此每次將對象賦值給一個sp指針的時候,對象的強引用計數(shù)都會加1,下面我們再看看sp的析構(gòu)函數(shù):

  1. template<typename T>  
  2. sp<T>::~sp()  
  3. {  
  4.     if (m_ptr) m_ptr->decStrong(this);  
  5. }  

 

      實際上每次delete一個sp對象的時候,sp指針指向的對象的強引用計數(shù)就會減一,當對象的強引用計數(shù)為0的時候這個對象就會被自動釋放掉。

 

      wp就是weak pointer的縮寫,wp 這個指針類,實際上是一個弱引用類型的指針類,弱引用是在.net 以及java中經(jīng)常用到的,弱引用是一個對象引用的持有者,使用弱引用后可以維持對對象的引用,但是不會阻止其被垃圾回收。如果一個對象只有弱引用了,那它就成為被垃圾回收的候選對象,就像沒有剩余的引用一樣,而且一旦對象被刪除,所有的弱引用也會被清除。弱引用適合那些數(shù)據(jù)成員特別多,而且重新創(chuàng)建又相對容易的類,也就是俗稱的胖子類,建立弱引用可以引用對象,但也不阻止其被垃圾回收,在內(nèi)存的使用方面取得一定的平衡。

 

   在androidwp 類里面的promote 函數(shù)實際上就是將一個弱引用升級為一個強引用。不管是sp 還是wp ,實際上都是android 利用現(xiàn)有的c++ 特性來解決內(nèi)存使用和回收的一種手段。 

  我們首先來看wp的一個構(gòu)造函數(shù):
 

  1. wp<T>::wp(T* other)  
  2.     : m_ptr(other)  
  3. {  
  4.     if (other) m_refs = other->createWeak(this);  
  5. }  

 

它和sp一樣實際上也就是僅僅對指針進行了賦值而已,對象本身會增加一個對自身的弱引用計數(shù),同時wp還包含一個m_refs指針,這個指針主要是用來將wp升級為sp時候使用的:

  1. template<typename T>  
  2. sp<T> wp<T>::promote() const  
  3. {  
  4.     return sp<T>(m_ptr, m_refs);  
  5. }  
  6.   
  7. template<typename T>  
  8. sp<T>::sp(T* p, weakref_type* refs)  
  9.     : m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)  
  10. {  
  11. }  

 

實際上我們對wp指針唯一能做的就是將wp指針升級為一個sp指針,然后判斷是否升級成功,如果成功說明對象依舊存在,如果失敗說明對象已經(jīng)被釋放掉了。wp指針我現(xiàn)在看到的是在單例中使用很多,確保hardware對象只有一個,比如(CameraHardwareStub.cpp):

  1. wp<CameraHardwareInterface> CameraHardwareStub::singleton;  
  2. sp<CameraHardwareInterface> CameraHardwareStub::createInstance()  
  3. {  
  4.   
  5.     if (singleton != 0) {  
  6.         sp<CameraHardwareInterface> hardware = singleton.promote();  
  7.         if (hardware != 0) {  
  8.             return hardware;  
  9.         }  
  10.     }  
  11.   
  12.     sp<CameraHardwareInterface> hardware(new CameraHardwareStub());   //強引用加1   
  13.   
  14.     singleton = hardware;//弱引用加1   
  15.     return hardware;//賦值構(gòu)造函數(shù),強引用加1   
  16. }  
  17. //hardware被刪除,強引用減1   
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android的垃圾回收機制
Android中的sp和wp指針
RefBase
Android智能指針sp wp詳解
紅狼博客 ? Android中的強指針和弱指針
pimpl idiom in c++
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服