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

原因

使用__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)