一文理解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!

推薦閱讀: