objective-c - 在 block 保留周期中调用函数

标签 objective-c ios block retain-cycle

如果我从 block 内部调用的函数引用“self”,是否会创建一个保留循环?

__weak id weakSelf = self;

- (void)firstFunction
{
    id strongSelf = weakSelf;
    if (!strongSelf) return;

    [anObject performBlock:^{
        [strongSelf secondFunction];
    }];
}

- (void)secondFunction
{
    [self doSomeCrazyStuff];
    self.counter++;
    //etc.
}

我在“secondFunction”中调用“self”,是否需要将我的弱指针传递给此函数并改为使用它?

最佳答案

有可能。

保留循环是通过strong 引用循环创建的,变量 上的限定符(即弱、强)是这些引用所在的实际变量来自是无关紧要的。因此,您的 block 引用的 strongSelf 是对 self 的强引用,并且您具有与使用 self 相同的保留周期潜力本身。

回复:评论

让您的 block 保持弱引用是解决此问题的标准方法。如果您在 block 中使用 weakSelf 则没有强引用,如果在 block 被调用时 weakSelfnil 那么调用 [weakSelf secondFunction] 什么都不做——你可以在 Objective-C 中发送消息 nil。您不会创建循环,在 block 调用期间可能会创建引用的强副本,但这将在 block 调用返回后进行。

关于objective-c - 在 block 保留周期中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468362/

相关文章:

iphone - iOS 将 View 和图像编码/解码到文件目录中

ios - 警告! ejabberd 无法启动 管理员用户未创建 请检查您的配置

jquery - 旋转设备方向时,JSSOR slider 无法在 iOS 中正确调整大小

html - 当我不想创建另一个时如何重用我的 <div>

objective-c - iOS:自定义对象的 NSPredicate 作为属性

ios - tableView.datasource = 自身错误 :unrecognized selector

iphone - iPhone 应用程序发布配置中的无尽 "for"循环

ios - didDiscoverPeripheral : not working sometimes on background

ruby - block 缩进正则表达式

sql-server - SQL Server 中许多操作超时并阻塞进程