美文网首页
为什么 weakSelf 需要配合 strong self 使用

为什么 weakSelf 需要配合 strong self 使用

作者: stonl | 来源:发表于2017-12-21 23:12 被阅读0次

    我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码:

    __weak typeof(self) weakSelf = self;

    [self doSomeBackgroundJob:^{

    __strong typeof(weakSelf) strongSelf = weakSelf;

       if (strongSelf) {

           ...

       }

    }];

    那么请问:为什么 block 里面还需要写一个 strong self,如果不写会怎么样?

    |

    |

    |

    |

    |

    |

    |

    | 思考时间,想好了请往下翻答案。

    |

    |

    |

    |

    |

    |

    |

    |

    |

    答案

    在 block 中先写一个 strong self,其实是为了避免在 block 的执行过程中,突然出现 self 被释放的尴尬情况。通常情况下,如果不这么做的话,还是很容易出现一些奇怪的逻辑,甚至闪退。

    我们以 AFNetworking 中 AFNetworkReachabilityManager.m 的一段代码举例:

    __weak __typeof(self)weakSelf = self;

    AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {

       __strong __typeof(weakSelf)strongSelf = weakSelf;

       strongSelf.networkReachabilityStatus = status;

    if (strongSelf.networkReachabilityStatusBlock) {

       strongSelf.networkReachabilityStatusBlock(status);

       }

    };

    如果没有 strongSelf 的那行代码,那么后面的每一行代码执行时,self 都可能被释放掉了,这样很可能造成逻辑异常。特别是当我们正在执行

    strongSelf.networkReachabilityStatusBlock(status); 这个 block 闭包时,如果这个 block 执行到一半时 self 释放,那么多半情况下会 Crash。

    相关文章

      网友评论

          本文标题:为什么 weakSelf 需要配合 strong self 使用

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