標籤:style io ar os sp strong on 問題 代碼
無意中看到有人在諮詢block循環參考如何解決的問題:記錄下來,方便童鞋們參考
ios開發中,開了ARC模式,系統自動管理記憶體,如果程式中用到了block就要注意循環參考帶來的記憶體泄露問題了
這幾天遇到一個問題,正常頁面dismiss的時候是要調用dealloc方法的,但是我的程式就是不調用,研究了好久終於找到了問題出在哪裡了
起初的代碼如下:
- (void)getMyrelatedShops
{
[self.loadTimer invalidate];
self.loadTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
target:discoverView
selector:@selector(loadWaiting)
userInfo:nil
repeats:YES];
sendedRequest = [[FindShopService sharedInstance] getMyRelatedShopsWithPageNO:pageNo
successBlock:^(TMRequest *request){
[self.loadTimer invalidate];
[self shopListRequestFinished:request];
}failedBlock:^(TMRequest *failedRequest){
[self.loadTimer invalidate];
[self shopListRequestFailed:failedRequest];
}];
}
代碼錶面上看起來沒有什麼問題,但是細細研究就會發現兩個問題
1、block中引用到self,self 被block retain,sendedRequest又retain了該block的一根拷貝
2.sendedRequest是在self類中定義賦值,因此是被self retain
因此就形成了循環參考,不會調用dealloc
問題解決辦法:
__weak __typeof(&*self)weakSelf = self;
your block = ^(NSInteger index)
{
//在block中醬紫用
__strong __typeof(&*weakSelf)strongSelf = weakSelf;
if (!strongSelf)
{
return;
}
strongSelf.selectedIndex = index;
};
ios block 循環參考