對 FBRetainCycleDetector 中實現的關聯對象機制的分析
FBAssociationManager is a tracker of object associations. For given object it can return all objects that are being retained by this object with objc_setAssociatedObject & retain policy.
FBRetainCycleDetector 在對關聯對象進行追蹤時,修改了底層處理關聯對象的兩個 C 函數,objc_setAssociatedObject 和 objc_removeAssociatedObjects。
FBAssociationManager
在 FBAssociationManager 的類方法 + hook 調用時,fishhook 會修改 objc_setAssociatedObject 和 objc_removeAssociatedObjects 方法:
+ (void)hook {
#if _INTERNAL_RCD_ENABLED
std::lock_guard《std::mutex》 l(*FB::AssociationManager::hookMutex);
rcd_rebind_symbols((struct rcd_rebinding[2]){
{
“objc_setAssociatedObject”,
(void *)FB::AssociationManager::fb_objc_setAssociatedObject,
(void **)&FB::AssociationManager::fb_orig_objc_setAssociatedObject
},
{
“objc_removeAssociatedObjects”,
(void *)FB::AssociationManager::fb_objc_removeAssociatedObjects,
(void **)&FB::AssociationManager::fb_orig_objc_removeAssociatedObjects
}}, 2);
FB::AssociationManager::hookTaken = true;
#endif //_INTERNAL_RCD_ENABLED
}
將它們的實現替換為 FB::AssociationManager:: fb_objc_setAssociatedObject 以及 FB::AssociationManager::fb_objc_removeAssociatedObjects 這兩個 Cpp 靜態方法。
上面的兩個方法實現都位于 FB::AssociationManager 的命名空間中:
namespace FB { namespace AssociationManager {
using ObjectAssociationSet = std::unordered_set《void *》;
using AssociationMap = std::unordered_map《id, ObjectAssociationSet *》;
static auto _associationMap = new AssociationMap();
static auto _associationMutex = new std::mutex;
static std::mutex *hookMutex(new std::mutex);
static bool hookTaken = false;
。。.
}
命名空間中有兩個用于存儲關聯對象的數據結構:
AssociationMap 用于存儲從對象到 ObjectAssociationSet * 指針的映射
ObjectAssociationSet 用于存儲某對象所有關聯對象的集合
其中還有幾個比較重要的成員變量:
_associationMap 就是 AssociationMap 的實例,是一個用于存儲所有關聯對象的數據結構
_associationMutex 用于在修改關聯對象時加鎖,防止出現線程競爭等問題,導致不可預知的情況發生
hookMutex 以及 hookTaken 都是在類方法 + hook 調用時使用的,用于保證 hook 只會執行一次并保證線程安全
用于追蹤關聯對象的靜態方法 fb_objc_setAssociatedObject 只會追蹤強引用:
static void fb_objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) {
{
std::lock_guard《std::mutex》 l(*_associationMutex);
if (policy == OBJC_ASSOCIATION_RETAIN ||
policy == OBJC_ASSOCIATION_RETAIN_NONATOMIC) {
_threadUnsafeSetStrongAssociation(object, key, value);
} else {
// We can change the policy, we need to clear out the key
_threadUnsafeResetAssociationAtKey(object, key);
}
}
fb_orig_objc_setAssociatedObject(object, key, value, policy);
}
std::lock_guard《std::mutex》 l(*_associationMutex) 對 fb_objc_setAssociatedObject 過程加鎖,防止死鎖問題,不過 _associationMutex 會在作用域之外被釋放。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
對 FBRetainCycleDetector 中實現的關聯對象機制的分析下載
相關電子資料下載
- iOS17.1可能明天發布,iOS17.1主要修復哪些問題? 377
- 華為全新鴻蒙蓄勢待發 僅支持鴻蒙內核和鴻蒙系統應用 719
- 蘋果手機系統iOS 17遭用戶質疑 731
- iPhone12輻射超標?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標明年智能手機出貨7000萬部;消息稱 MiOS 僅限國內,小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機身過熱 216
- Testin云測兼容和真機服務平臺中上線iPhone 15系列手機 208
- 利爾達推出搭載HooRiiOS的Matter模組 145
- 運放參數解析:輸入偏置電流(Ibias)和失調電流(Ios) 128
- 昆侖太科發布支持國產飛騰騰銳D2000芯片的開源BIOS固件版本 448