iOSの最も強力な位置決めメモリ漏洩ツール
3521 ワード
MLeaksFinder 元コード一: 修正後:元コード2: 修正後:元コード3:
修正後:元コード4:
修正後:元コード5:
修正後:
*__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はメンバー変数*/ 修正後:
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);
}];
[_shareBtn bk_whenTapped:^{
_shareClicked();
}];
__weak typeof(self) weakSelf = self;
[_shareBtn bk_whenTapped:^{
weakSelf.shareClicked();
}];
[_rightBackBtn bk_whenTapped:^{
[self.viewController.navigationController popViewControllerAnimated:YES];
}];
修正後:
[_rightBackBtn bk_whenTapped:^{
[weakSelf.viewController.navigationController popViewControllerAnimated:YES];
}];
__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();
}
}];
/*! 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内部で保持し、ループリファレンスの問題を回避することができます.
_mainView , _mainView self.superview