色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>通訊/手機編程>

對 FBRetainCycleDetector 中實現的關聯對象機制的分析

大小:0.3 MB 人氣: 2017-09-26 需要積分:1

  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%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 善良的小峓子2在钱免费中文字 | 老头狠狠挺进小莹体内视频 | 欧美成人无码A区在线观看免费 | 秋霞成人午夜鲁丝一区二区三区 | 夜夜女人国产香蕉久久精品 | 超碰人人草在线视频 | 麻豆产精品一二三产区区 | 神电影院午夜dy888我不卡 | 国产精品99久久免费黑人人妻 | 国产无遮挡色视频免费观看性色 | 国自精品三七区 | 妹妹我要操 | 免费在线观看的毛片 | 精品视频免费在线观看 | 动漫美女性侵 | 一品道门在线观看免费视频 | 久久99精品视频 | 国产午夜精品一区理论片飘花 | 99香蕉精品视频在线观看 | 国产成人精品电影 | 香蕉鱼视频观看在线视频下载 | 亚州三级久久电影 | 日本黄色网站在线观看 | 99久酒店在线精品2019 | 国产亚洲精品影视在线 | 日本AAA片爽快视频 日本aaaa | 国产精人妻无码一区麻豆 | 中文字幕人成人乱码亚洲影视 | 97精品视频在线观看 | 九九热视频免费观看 | 久久中文字幕人妻熟AV女蜜柚M | 公粗挺进了我的密道在线播放贝壳 | 日本19禁啪啪吃奶大尺度 | 影音先锋 av天堂 | 国产精品无码亚洲区艳妇 | 亚洲国产精品第一影院在线观看 | 十分钟视频影院免费 | 777午夜精品久久AV蜜臀 | 国产精品无码人妻99999 | 久久亚洲一级α片 | 十大禁止安装的黄台有风险 |