1. 程式人生 > >Android RefBase類(sp,wp)

Android RefBase類(sp,wp)

        個人覺得sp和wp實際上就是android為其c++實現的垃圾自動回收機制,具體到內部實現,sp和wp實際上只是一個實現垃圾回收功能的介面而已,比如說對*,->的過載,是為了其看起來跟真正的指標一樣,而真正實現垃圾回收的是RefBase這個基類。這部分程式碼的目錄在:/frameworks/base/include/utils/RefBase.h
        首先所有的類都會虛繼承RefBase類,因為它實現了達到垃圾回收所需要的所有function,因此實際上所有的物件宣告出來以後都具備了自動釋放自己的能力,也就是說實際上智慧指標就是我們的物件本身,它會維持一個對本身強引用和弱引用的計數,一旦強引用計數為0它就會釋放掉自己。
      首先我們看sp,sp實際上不是smart pointer的縮寫,而是strong pointer,它實際上內部就包含了一個指向物件的指標而已。我們可以簡單看看sp的一個建構函式:

    

    比如說我們宣告一個物件:
    sp<CameraHardwareInterface> hardware(new CameraHal());
    實際上sp指標對本身沒有進行什麼操作,就是一個指標的賦值,包含了一個指向物件的指標,但是物件會對物件本身增加一個強引用計數,這個 incStrong的實現就在RefBase類裡面。新new出來一個CameraHal物件,將它的值給 sp<CameraHardwareInterface>的時候,它的強引用計數就會從0變為1。因此每次將物件賦值給一個sp指標的時候,物件的強引用計數都會加1,下面我們再看看sp的解構函式:

      實際上每次delete一個sp物件的時候,sp指標指向的物件的強引用計數就會減一,當物件的強引用計數為0的時候這個物件就會被自動釋放掉。

      wp就是weak pointer的縮寫,wp 這個指標類,實際上是一個弱引用型別的指標類,弱引用是在.net 以及java中經常用到的,弱引用是一個物件引用的持有者,使用弱引用後可以維持對物件的引用,但是不會阻止其被垃圾回收。如果一個物件只有弱引用了,那它就成為被垃圾回收的候選物件,就像沒有剩餘的引用一樣,而且一旦物件被刪除,所有的弱引用也會被清除。弱引用適合那些資料成員特別多,而且重新建立又相對容易的類,也就是俗稱的胖子類,建立弱引用可以引用物件,但也不阻止其被垃圾回收,在記憶體的使用方面取得一定的平衡。

   在androidwp 類裡面的promote 函式實際上就是將一個弱引用升級為一個強引用。不管是sp 還是wp ,實際上都是android 利用現有的c++ 特性來解決記憶體使用和回收的一種手段。 

  我們首先來看wp的一個建構函式:
 

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

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

相關推薦

Android RefBase(sp,wp)

        個人覺得sp和wp實際上就是android為其c++實現的垃圾自動回收機制,具體到內部實現,sp和wp實際上只是一個實現垃圾回收功能的介面而已,比如說對*,->的過載,是為了其看起來跟真正的指標一樣,而真正實現垃圾回收的是RefBase這個基類。這部分程

android中的 sp,wp學習筆記

1.如何才能支援sp,wp   只支援sp的情況,只要實現下面2個函式就行   class simpleRefbase{    void incStrong(const void* id);    void decStrong(const void* id);   };

Android智慧指標SP WP使用方法介紹

Android手機作業系統既然是開源的作業系統。那麼在具體的資料夾中就會存放著各種相關功能的開原始碼。我們在使用的時候可以根據這些原始碼進行相應的修改就能輕鬆的完成我們所需的功能。在這裡大家就一起來看看Android智慧指標的相關原始碼解讀以及應用方法。 在Androi

Android智慧指標 (sp & wp)

http://bbs.chinabyte.com/thread-452223-1-1.html 在Android的原始碼中,經常會看到形如:sp<xxx>、wp<xxx>這樣的型別定義,這其實是Android中的智慧 指標。智慧指標是C++中的一個概念,通過基於引用計數的方法,解決物

Androidspwp 模板 以及RefBase

sp 和 wp 類模板 以及RefBase類的程式碼在frameworks/base/include/utils/RefBase.h 和 frameworks/base/libs/utils/RefBase.cpp 中。 sp是Strong pointer ,wp是We

android中px,sp,dp之間相互轉化的工具

在平時開發中,難免遇到需要在程式碼裡對尺寸進行轉化的問題,在這裡總結一下,方便以後呼叫 public class DensityUtil { /** * dp轉換成px */ private int dp2px(Context context,float dp

sp wp-Android中定義了兩種智慧指標強指標sp和弱指標wp

中定義了兩種智慧指標型別,一種是強指標sp(strong pointer),另外一種是弱指標(weak pointer)。其實稱之為強引用和弱引用更合適一些。強指標與一般意義的智慧指標概念相同,通過引用計數來記錄有多少使用者在使用一個物件,如果所有使用者都放棄了對該物件的

android中的spwp

關於android sp和wp的實現原理,網上很多介紹的。但是為何android為何要設計這兩個智慧指標?使用過程中需要注意什麼? 為何設計智慧指標 首先sp和wp是針對c++而設計的,因為Java根本就沒有指標的概念,替使用者減少了很多不

智慧指標(android sp wp)

1. 智慧指標實現的原理是:物件內部保持著物件本身的引用數目,當引用數目為0時,也說明此物件沒有地方再使用到,呼叫delete來刪除自身即可。 2. 棧中的普通物件的生命週期只是在該方法體內部,當所在方法返回,實現堆疊平衡時,棧中普通物件的析構方法會被自動呼叫 。如andr

Android 工具 SharedPreferences 封裝

state out into bool 替換 ole enc 例子 read   SharedPreferences 是 Android 數據存儲方式中的一種,特別適合用來存儲少量的、格式簡單的數據,比如應用程序的各種配置信息,如是否打開音效,是否開啟震動等等。  Shar

android application簡單介紹(一)

cati theme text color raw sdn water bsp public 每次應用程序執行時。應用程序的application類保持實例化的狀態。通過擴展applicaiton類,能夠完畢下面3項工作: 1.對android執行時廣播的應用程序

Android BatteryManager

相關文章 Android BatteryManager類 Android TelephonyManager類 Android ConnectivityManager類 Android Vibrator類 1. BatteryManager類 獲取電量資訊需要註冊一個Broadca

用Gson、FastJson、Android原生三種方式做Json節點解析

一、用Gson做節點解析 json: {'flag':true,'data':{'name':'張三','age':18,'sex':true}} 步驟 : 獲得 解析者 JsonParser parser = new JsonParser(); 獲

Android Build

Log.i(TAG,"裝置引數:"+Build.DEVICE); Log.i(TAG,"顯示屏引數:"+Build.DISPLAY); Log.i(TAG,"硬體製造商:"+Build.MANUFACTURER); Log.i(TAG,"產品名:"+B

Android Handler

相關文章 Android AsyncTask類 Android Handler類 Android IntentService應用 1. Handler類 Handler類被用於非同步訊息處理執行緒,常被用來更新UI執行緒。 一般來說我們會在主執行緒中建立一個Hand

Android AsyncTask

相關文章 Android AsyncTask類 Android Handler類 1. AsyncTask類 AsyncTask,非同步任務,用於在後臺執行緒執行一個任務,在UI執行緒上修改介面。AsyncTask<Params, Progress, Result>需

Android Environment

1. 外部儲存狀態 通過靜態方法Environment.getExternalStorageState()來獲取外部儲存狀態。 欄位 含義 Environment.MEDIA_REMOVED

Android Vibrator

相關文章 Android BatteryManager類 Android TelephonyManager類 Android ConnectivityManager類 Android Vibrator類 1. Vibrator類 Vibrator類用於控制手機震動。 Vibr

Android ConnectivityManager

相關文章 Android BatteryManager類 Android TelephonyManager類 Android ConnectivityManager類 Android Vibrator類 1. ConnectivityManager類 ConnectivityMa

Android TelephonyManager

相關文章 Android BatteryManager類 Android TelephonyManager類 Android ConnectivityManager類 Android Vibrator類 1. TelephonyManager類 TelephonyManager類