Swift源碼之引用計數管理一
-
標識
Object-C
或者Swift
的內存管理標志類typedef unsigned long uintptr_t; /// 標識引用計數管理 class WeakReferenceBits { /// 標識 enum : uintptr_t { /// ObCject-C class NativeMarkerMask = 0 /// Swift class NativeMarkerValue = 0 } /// 存儲的bits位 uintptr_t bits; /// 獲取 side-table HeapObjectSideTableEntry *getNativeOrNull() const { assert(isNativeOrNull()); if (bits == 0) return nullptr; else return reinterpret_cast<HeapObjectSideTableEntry *>(bits & ~NativeMarkerMask); } /// 設置side-table void setNativeOrNull(HeapObjectSideTableEntry *newValue) { assert((uintptr_t(newValue) & NativeMarkerMask) == 0); if (newValue) bits = uintptr_t(newValue) | NativeMarkerValue; else bits = 0; } };
-
WeakReference
的負責管理WeakReferenceBits
// Redeclare APIs from the Objective-C runtime. // These functions are not available through public headers, but are guaranteed // to exist on OS X >= 10.9 and iOS >= 7.0. OBJC_EXPORT id objc_retain(id); OBJC_EXPORT void objc_release(id); OBJC_EXPORT id _objc_rootAutorelease(id); OBJC_EXPORT void objc_moveWeak(id*, id*); OBJC_EXPORT void objc_copyWeak(id*, id*); OBJC_EXPORT id objc_initWeak(id*, id); OBJC_EXPORT void objc_destroyWeak(id*); OBJC_EXPORT id objc_loadWeakRetained(id*); /// 引用計數管理 class WeakReference { union { /// atomic 僅僅是為了保證線程安全加的鎖,實際操作還是 WeakReferenceBits std::atomic<WeakReferenceBits> nativeValue; /// 如果是OBJC類型 #if SWIFT_OBJC_INTEROP id nonnativeValue; #endif }; /// 區(qū)分OBJC和Swift的class void initWithNativeness(void *object, bool isNative) { if (isNative) /// swift-class nativeInit(static_cast<HeapObject *>(object)); else /// Objc-class nonnativeInit(static_cast<id>(object)); } void unknownInit(void *object) { /// 判斷是否是Objc類型 if (isObjCTaggedPointerOrNull(object)) { nonnativeValue = static_cast<id>(object); } else { /// 判斷是否使用Swift原生引用計數管理對象 bool isNative = objectUsesNativeSwiftReferenceCounting(object); initWithNativeness(object, isNative); } } /// OBJC-Class類型 void nonnativeInit(id object) { /// OC的initWeak方法被觸發(fā) objc_initWeak(&nonnativeValue, object); } /// Swift類的引用計數 void nativeInit(HeapObject *object) { /// 判斷是否存在side-Table auto side = object ? object->refCounts.formWeakReference() : nullptr; nativeValue.store(WeakReferenceBits(side), std::memory_order_relaxed); } /// 釋放機制 void destroyWithNativeness(bool isNative) { if (isNative) nativeDestroy(); else nonnativeDestroy(); } /// 原生Swift-class釋放 void nativeDestroy() { auto oldBits = nativeValue.load(std::memory_order_relaxed); nativeValue.store(nullptr, std::memory_order_relaxed); destroyOldNativeBits(oldBits); } /// 釋放Swift-class void destroyOldNativeBits(WeakReferenceBits oldBits) { auto oldSide = oldBits.getNativeOrNull(); if (oldSide) /// 這里下一篇文章講 decrementWeak oldSide->decrementWeak(); } /// OBJC-class釋放 void nonnativeDestroy() { objc_destroyWeak(&nonnativeValue); } }