解決block循環引用的三種方法

- (void) method1 {
    //解決循環引用的第一種方式
    //iOS 5.0 引用來解決循環引用的方式  和weak屬性關鍵字作用類似
    //當對象被系統回收時  對象的地址 會自動指向 nil  不會出現野指針訪問
    __weak typeof(self) weakSelf = self;
    [self.tools loadData:^(NSString *result) {
        NSLog(@"%@ %@",result,weakSelf);
    }];
}
- (void) method2{
    //解決循環引用的第二種方式
    //    __weak typeof(self) weakSelf = self;
    //會引起 EXC_BAD_ACCESS 錯誤 是MRC 時代最常見的錯誤  野指針  --> 壞地址訪問
    // 和 assgin屬性關鍵字的作用類似  對象被系統回收時 對象的地址不會自動指向nil
    // iOS4.0 和block 一起推出的 用來解決循環引用的
    __unsafe_unretained typeof(self) weakSelf = self;
    [self.tools loadData:^(NSString *result) {
        NSLog(@"%@ %@",result,weakSelf);
    }];
}

- (void) method3{

    //解決循環引用的第三種方式    
    //weak-strong-dance wwdc 推出的解決方式  在AFN中被大量的運用到
    __weak typeof(self) weakSelf = self;
    [self.tools loadData:^(NSString *result) {
        //閉包中對弱引用的weakSelf 在強引用一下
        __strong typeof(weakSelf) strongSelf = weakSelf;
        NSLog(@"%@ %@",result,strongSelf);
    }];
    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章