美文网首页
5-2 Block为什么使用__weak 和 __strong

5-2 Block为什么使用__weak 和 __strong

作者: Rumbles | 来源:发表于2019-04-11 17:46 被阅读0次

    原因

    使用__weak市因为block内部会对应用的对象进行强引用 如果block不释放对象也就不释放 而且很容易造成循环引用 所以我们对block内部使用的对象进行弱引用
    
    一般情况在单线程情况下我们使用__weak 就够了 
    
    使用__weak 会出现一个问题那么就是由于weak是弱引用 那么我们引用的对象销毁的的话 __weak 修饰的对象会置为nil 这时内部引用对象会出现崩溃 所以我们应该在block对__weak 修饰的对象做 非空判断
    
    如果在block内部使用多线程还会出现一个问题就是:在执行上半部分代码的时候,对象还在,而在执行下半部代码的时候对象已经被释放
    
    这时我们应该使用 __strong  TestObj *strongObj = weakObj;
    函数内部使用对象 在函数销毁的时候才会销毁 保证对象的存在
    
    __weak修饰的对象被Block引用,不会影响对象的释放,而__strong在Block内部修饰的对象,会保证,在使用这个对象在scope内,这个对象都不会被释放,出了scope,引用计数就会-1,且__strong主要是用在多线程运用中,若果只使用单线程,只需要使用__weak即可
    
    另外typeof( ) 的个人理解及简单使用
    :可以根据typeof()括号里面的变量,自动识别变量类型并返回该类型
    最终结果可以理解为从新定义一个self 并且重新命名
    _weak typeof(self) self = self;
    

    参开链接

    里面使用 strong 会使得循环引用 导致释放不掉 到那时除了作用域就会释放

    会造成循环引用的前提下。我们使用 __strong  可以保证self存在
    - (void)backAction {
        
        [self.navigationController popViewControllerAnimated:YES];
    
        __weak __typeof(self)weakSelf = self;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            __strong __typeof(weakSelf)strongSelf = weakSelf;
            NSLog(@"ThreeController dispatch_after  %@",strongSelf.navigationItem.title);
        });
        
        NSLog(@"ThreeController  -------------------- %@",self.navigationItem.title);
    
        self.myblock = ^() {
            __strong __typeof(weakSelf)strongSelf = weakSelf;
            [NSThread sleepForTimeInterval:5.0];
            NSLog(@"ThreeController  -------------------- %@",strongSelf.navigationItem.title);
        };
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            self.myblock();
        });
    }
    

    属性的Block

    记住。里面。使用 self.name. _name  name 都会 强引用self
    

    相关文章

      网友评论

          本文标题:5-2 Block为什么使用__weak 和 __strong

          本文链接:https://www.haomeiwen.com/subject/kjvtmftx.html