gpt4 book ai didi

ios - 我是否需要检查 block 内的 strongSelf = weakSelf 赋值是否为 nil?

转载 作者:行者123 更新时间:2023-11-29 12:15:49 24 4
gpt4 key购买 nike

例如,我正在使用 SVInfiniteScrolling ( https://github.com/alexanderedge/SVInfiniteScrolling )。

我有一些看起来像这样的代码......

- (void)initializeInfiniteScrollingForTableView {
__weak MyViewController *weakSelf = self;

[self.tableView addInfiniteScrollingWithActionHandler:^{
MyViewController *strongSelf = weakSelf;
if (!strongSelf.endReached) {
[strongSelf fetchData];
}
else {
[strongSelf.tableView.infiniteScrollingView stopAnimating];
}
}];
}

我想知道的是......在这样使用之前我是否需要检查 strongSelf 是否为 nil......

...
[self.tableView addInfiniteScrollingWithActionHandler:^{
MyViewController *strongSelf = weakSelf;
if (strongSelf) { // <== ** Is this needed? **
if (!strongSelf.endReached) {

这就是我问的原因。从这个链接 ( http://www.apeth.com/iOSBook/ch12.html#EXstrongWeakDance ) 上的第 3 点开始,它说 “nil 测试是因为,在多线程情况下,我们对 self 的弱引用可能在上一步之前从我们下面消失了;然后它将是零,因为它是一个 ARC 弱引用,在那种情况下,继续下去就没有意义了。”

需要这个检查吗?我想你第一次在 block 中使用对 weakSelf 的引用时,它会在表达式的持续时间内保留?

最佳答案

对于您发布的代码,不需要检查 nil

这行代码:

if (!strongSelf.endReached) {

如果 strongSelf 为 nil,将评估为 false。进一步阅读:Sending a message to nil?

然后这行代码会执行:

[strongSelf.tableView.infiniteScrollingView stopAnimating];

如果 strongSelf 为 nil,该行将什么都不做(甚至不会出错)。

但是,一些开发人员认为无论如何检查 nil 是最佳实践,以防有人稍后添加代码并且它确实关心 nil。所以你应该考虑这样做:

MyViewController *strongSelf = weakSelf;
if (!strongSelf) {
return;
}

... the rest of your code ...

关于ios - 我是否需要检查 block 内的 strongSelf = weakSelf 赋值是否为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32041045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com