iOS __weak __block __strong 的使用

項(xiàng)目 Demo下載

oc版

__block: 在 block 里面需要改變外部變量的值就需要添加__block.
__weak: 弱引用,防止循環(huán)引用
__strong: 相當(dāng)于聲明一個(gè)局部變量, 在 block 使用完之后才會(huì)釋放. 也就是說(shuō)保證在 block 調(diào)用完之前, 對(duì)象不會(huì)被釋放

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    @Strongify,@Weakify主要是在block中使用.
//    因?yàn)閎lock一般都在對(duì)象內(nèi)部聲明.. 如果在block內(nèi)部使用了當(dāng)前對(duì)象的屬性,就會(huì)造成循環(huán)引用(block擁有當(dāng)前對(duì)象的地址,而當(dāng)前對(duì)象擁有block的地址),而引起內(nèi)存泄露,block和當(dāng)前對(duì)象都無(wú)法釋放.
//
//    @weakify(self) 將當(dāng)前對(duì)象聲明為weak.. 這樣block內(nèi)部引用當(dāng)前對(duì)象,就不會(huì)造成引用計(jì)數(shù)+1可以破解循環(huán)引用
//
//    @strongify(self) 相當(dāng)于聲明一個(gè)局部的strong對(duì)象,等于當(dāng)前對(duì)象.可以保證block調(diào)用的時(shí)候,內(nèi)部的對(duì)象不會(huì)釋放
    
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor redColor];
    __weak typeof(self) weakself = self;
    __block  NSInteger index = 0;
    self.testBlock = ^{
        index ++;
        //相當(dāng)于聲明一個(gè)局部的strong對(duì)象,等于當(dāng)前對(duì)象.可以保證block調(diào)用的時(shí)候,內(nèi)部的對(duì)象不會(huì)釋放
        __strong typeof(self) strongself = weakself;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [strongself test];
        });

    };
    NSLog(@"index = %ld",index);
}

-(void)test {
    NSLog(@"strongself生效了-----");
}
//模擬__strong 的使用場(chǎng)景.dissmiss 之后 block 內(nèi)部延遲 2 秒.  如果不適用__strong. self = nil.  加上了之后才會(huì)方法調(diào)用成功
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.navigationController dismissViewControllerAnimated:false completion:nil];
    
    if (self.testBlock) {
        self.testBlock();
    }

}

swift版

swift 里面如何使用__strong呢,其實(shí)也是有的. 如下面代碼:

class TestSwiftViewController: UIViewController {
    var testBlock = {}
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
        testBlock = { [weak self] in
       //關(guān)鍵代碼 if let strongSelf = self   strongSelf 就是一個(gè)臨時(shí)變量.  在 block 執(zhí)行完之前不會(huì)釋放.
            if let strongSelf = self {
                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                        strongSelf.test()
                }
            }
        }
    }
    
    func test() {
        print("swift 輸出了")
    }
    
    deinit {
        print("釋放了")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        navigationController?.dismiss(animated: false, completion: nil)
      
        self.testBlock()
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容