gpt4 book ai didi

ios - objective-c - block 保留周期

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:02:24 26 4
gpt4 key购买 nike

我有一个 block 保留周期问题,
假设我有以下 3 种方法,都在一个类中。

- (void)foo1WithBlock:(void (^)(BOOL success))completion
// do something...
completion(YES)
}

- (void)foo2 {
// do something...
}

- (void)foo3 {
[self foo1WithBlock:^(BOOL success) {
[self foo2];
}];
}

foo3 会创建一个保留周期吗?

最佳答案

不,没有保留周期。

但是,self 将被捕获。这意味着,self 将被导入 到复合语句(由 block 执行的语句)的词法范围内。这涉及制作“外部”变量 self 的副本,该副本创建 block 的变量 self

block 可以被复制释放block_copy 操作会将捕获的变量“移动”到堆上。它们一直存在,直到 block 通过 block_release 操作被销毁。编译器/运行时提供内部函数来复制和释放 block 并在需要时执行它们。例如,如果通过 dispatch_async() 异步执行 block ,则必须首先复制,然后在 block 完成后,释放 em> 再次。这些block_copyblock_release 操作由编译器插入并由运行时执行,所以不用担心。

如果 block 将被复制,作为效果 self 将被保留,并在 block 被释放时再次释放 - 这发生在 block 完成时。

实际上,这保证了 self 在 block 内和 block 的生命周期内是有效的(也就是说,它不会被释放),无论它是同步调用还是异步调用.当 block 被异步执行时, block 被复制,因此 self 被保留。并且 self 只会在 block 完成之前再次释放。这也意味着,该 block “将”延长 self 的生命周期,直到该 block 结束。

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

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