iOSの最も強力な位置決めメモリ漏洩ツール

3521 ワード

MLeaksFinder MLeaksFinder ,
  • 元コード一:
      UIButton *btn = [self createBtnWithTitle:title];
      /*!        */
      [btn bk_whenTapped:^{
          int tag = (int)btn.tag;
          self.selectedBtnType = tag;
          self.clicked(tag);
      }];
    
  • 修正後:
        int tag = (int)btn.tag;
        /*!        */
        __weak typeof(self) weakSelf = self;
        [btn bk_whenTapped:^{
            weakSelf.selectedBtnType = tag;
            weakSelf.clicked(tag);
        }];
    
  • 元コード2:
     [_shareBtn bk_whenTapped:^{
          _shareClicked();
      }];
    
  • 修正後:
         __weak typeof(self) weakSelf = self;
        [_shareBtn bk_whenTapped:^{
            weakSelf.shareClicked();
        }];
    
  • 元コード3:
  •  [_rightBackBtn bk_whenTapped:^{
            [self.viewController.navigationController popViewControllerAnimated:YES];
        }];
    

    修正後:
     [_rightBackBtn bk_whenTapped:^{
            [weakSelf.viewController.navigationController popViewControllerAnimated:YES];
        }];
    
  • 元コード4:
  •  __weak typeof(self) weakSelf = self;
    [propertyView addObserverBlockForKeyPath:@"selectedSku" block:^(__weak id obj, ALGoodsSKUItem *oldItem, ALGoodsSKUItem *newItem) {
        if (![newItem.SKUID isEqualToString:oldItem.SKUID]) {
                _currShowSkuItem = newItem;
                weakSelf.requestActivityData();
        }
    }];
    

    修正後:
      __weak typeof(self) weakSelf = self;
    [propertyView addObserverBlockForKeyPath:@"selectedSku" block:^(__weak id obj, ALGoodsSKUItem *oldItem, ALGoodsSKUItem *newItem) {
        if (![newItem.SKUID isEqualToString:oldItem.SKUID]) {
                weakSelf.currShowSkuItem = newItem;
                weakSelf.requestActivityData();
        }
    }];
    
  • 元コード5:
  • /*!   address frame,                      */
    /*! headerTitleView/headerView/headerTitleView/addressView          */
    __weak typeof(self) weakSelf = self;
    [self.addressView addObserverBlockForKeyPath:@"frame" block:^(__weak id obj, id oldVal, id newVal) {
        headerTitleView.top = addressView.bottom;
        headerView.height = headerTitleView.bottom;
        weakSelf.tableView.tableHeaderView = headerView;
    }];
    

    修正後:
    /*!   address frame,                      */
    /*! headerTitleView/headerView/headerTitleView/addressView          */
    __weak typeof(self) weakSelf = self;
    __weak typeof(headerTitleView) weakHeaderTitleView = headerTitleView;
    __weak typeof(addressView) weakAddressView = addressView;
    __weak typeof(headerView) weakHeaderView = headerView;
    [self.addressView addObserverBlockForKeyPath:@"frame" block:^(__weak id obj, id oldVal, id newVal) {
        weakHeaderTitleView.top = weakAddressView.bottom;
        weakHeaderView.height = weakHeaderTitleView.bottom;
        weakSelf.tableView.tableHeaderView = weakHeaderView;
    }];
    
    : , __block , , __block __weak
    *__blockと_weakの違い:1.MRC環境では、_blockは弱引用、ARC環境では強引用2._block自体はループ参照の問題を回避することはできませんが、block内部で手動でblockObjをnilに割り当てることでループ参照の問題を回避することができます.もう一つは_block修飾変数はblock内外で唯一であり,この特性がもたらす可能性のある危険性に注意しなければならない.3.__Weak自体はループリファレンスの問題を回避できますが、外部オブジェクトが解放された後、block内部にもこのオブジェクトにアクセスできない問題を引き起こす可能性があります.strongの変数をblock内部に宣言することでweakObjを指し、外部オブジェクトをblock内部で保持し、ループリファレンスの問題を回避することができます.
  • 元コード5:mainView = self.superview;/*! _mainViewはメンバー変数*/
  • 修正後:
      _mainView   ,  _mainView  self.superview