一文理解Android系統中強指針的實現
強指針和弱指針基礎
android中的智能指針包括:輕量級指針、強指針、弱指針。
強指針:它主要是通過強引用計數來進行維護對象的生命周期。
弱指針:它主要是通過弱引用計數來進行維護所指向對象的生命周期。
如果在一個類中使用瞭強指針或者弱指針的技術,那麼這個類就必須從RefBase這個類進行做繼承,因為強指針和弱指針是通過RefBase這個類來提供實現的引用計數器。
強指針和弱指針關系相對於輕量級指針來說更加親密,因此他們一般是相互配合使用的。
強指針原理分析
以下針對源碼的分析都是來源於android5.0系統源碼
強指針的定義實現主要在\frameworks\rs\cpp\util\RefBase.h文件中
class RefBase { public: //定義瞭成員變量用於維護強引用對象的引用計數 void incStrong(const void* id) const; //定義瞭成員變量用於維護強引用對象的引用計數 void decStrong(const void* id) const; void forceIncStrong(const void* id) const; //獲取強指針計數的數量. int32_t getStrongCount() const; //這個類主要實現計數器的 class weakref_type { public: RefBase* refBase() const; void incWeak(const void* id); void decWeak(const void* id); // acquires a strong reference if there is already one. bool attemptIncStrong(const void* id); // acquires a weak reference if there is already one. // This is not always safe. see ProcessState.cpp and BpBinder.cpp // for proper use. bool attemptIncWeak(const void* id); //! DEBUGGING ONLY: Get current weak ref count. int32_t getWeakCount() const; //! DEBUGGING ONLY: Print references held on object. void printRefs() const; //! DEBUGGING ONLY: Enable tracking for this object. // enable -- enable/disable tracking // retain -- when tracking is enable, if true, then we save a stack trace // for each reference and dereference; when retain == false, we // match up references and dereferences and keep only the // outstanding ones. void trackMe(bool enable, bool retain); }; weakref_type* createWeak(const void* id) const; weakref_type* getWeakRefs() const; //! DEBUGGING ONLY: Print references held on object. inline void printRefs() const { getWeakRefs()->printRefs(); } //! DEBUGGING ONLY: Enable tracking of object. inline void trackMe(bool enable, bool retain) { getWeakRefs()->trackMe(enable, retain); } typedef RefBase basetype; protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { OBJECT_LIFETIME_STRONG = 0x0000, OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_MASK = 0x0001 }; void extendObjectLifetime(int32_t mode); //! Flags for onIncStrongAttempted() enum { FIRST_INC_STRONG = 0x0001 }; virtual void onFirstRef(); virtual void onLastStrongRef(const void* id); virtual bool onIncStrongAttempted(uint32_t flags, const void* id); virtual void onLastWeakRef(const void* id); private: friend class ReferenceMover; static void moveReferences(void* d, void const* s, size_t n, const ReferenceConverterBase& caster); private: friend class weakref_type; //通過類對象來獲取計數器數據。 class weakref_impl; RefBase(const RefBase& o); RefBase& operator=(const RefBase& o); weakref_impl* const mRefs; };
通過以上類定義可以看到 RefBase類裡面嵌套著weakref_type類,這個weakref_type類也的對象mRefs來描述對象的引用計數。也就是說每一個RefBase對象都包含一個weakref_type對象。
virtual表示的是虛函數,friend表示友元函數,
總結
如果一個對象的生命周期控制標志值被設置為0的情況下,隻要它的強引用計數值也為0,那麼系統就會自動釋放這個對象。
到此這篇關於一文理解Android系統中強指針的實現的文章就介紹到這瞭,更多相關Android 強指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 理解關於Android系統中輕量級指針的實現
- C++11中的智能指針shared_ptr、weak_ptr源碼解析
- 關於C語言中弱符號與弱引用的實際應用問題
- c++元編程模板函數重載匹配規則示例詳解
- 一文搞懂c++中的std::move函數