android RefBase、sp、wp
生活随笔
收集整理的這篇文章主要介紹了
android RefBase、sp、wp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先RefBase在android的c++部分是作為一個所有類的基類,其作用跟Java中的Object類似 這個類中存在一個私有成員: weakref_impl* const mRefs;(weakref_impl是weakref_type的子類) 這個mRefs是“影子對象”,是管理一個對象的引用計數的關鍵 RefBase的構造中mRefs(new weakref_impl(this)),new一個weakref_impl對象,weakref_impl的構造形參是RefBase的指針 同時會初始化weakref_impl的mStrong和mWeak這兩個成員,這兩個就是關鍵的強引用計數和弱引用計數 /********************RefBase的使用和原理其實很簡單*****************************/ 接下來看看sp和wp(4.4及更高版本的源碼中,sp不在RefBase中了,是放在StrongPointer的文件中) wp: template<typename T> wp<T>::wp(T* other) : m_ptr(other) //wp<A>中使用m_ptr指向實際的對象 { if (other) m_refs = other->createWeak(this); //m_ref是一個RefBase中的weakref_type的對象,可以看出是將實際對象的影子對象加工處理之后再傳給wp的成員的,也就是說wp握有一個實際對象的影子對象 } wp是一個模板類,wp<A> wpA(pA);當然其構造函數有很多還可以用sp<A>來構造 other->createWeak(this);會調到RefBase的createWeak,然后調用影子對象mRefs的增加弱引用計數 wp的析構函數: template<typename T> wp<T>::~wp() { if (m_ptr) m_refs->decWeak(this); } 在wp析構的過程中,回去調用實際對象的影子對象的弱引用自減,自減過后,弱引用會判斷當前的引用計數,如果為0,則調用自身的析構,釋放內存 sp與wp類似 但是sp內部僅有指向實際對象的指針的成員(但有指向實際對象的指針也能夠找到影子對象) 構造過程中會找到實際對象的影子對象,然后將影子對象的強引用和弱引用都自加 然后值析構的過程中分兩步走: 1.首先減少影子對象的強引用計數,這時判斷如果強引用計數為0的話則析構實際數據本身 2.再減少影子對象的弱引用計數,然后但弱引用計數為0的話就將影子對象釋放 這種弱指針和強指針在android系統中起到的作用:就是用這個代替傳統的指針,讓代碼中自行管理對象的內存釋放,避免人工造成的內存泄露 項目中用過 pA = new A(); sp<A> spA = pA; sp<A> spA(pA); 這里就重載了等號操作符 重載操作符是為了讓這些操作符更加適用于更多的類類型 template<typename T> sp<T>& sp<T>::operator = (T* other) { if (other) other->incStrong(this); //this的含義是類中函數的一個隱含參數,指向該類本身,這里就是指向sp<T> if (m_ptr) m_ptr->decStrong(this); //空構造mptr初始化0 m_ptr = other; return *this; }
轉載于:https://www.cnblogs.com/ideawu1001/p/4288299.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的android RefBase、sp、wp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用qmeu-img创建虚拟机[创建虚拟
- 下一篇: 说说音箱