ios - 类方法 block 上的保留循环

标签 ios objective-c block retain weak

据我所知,当我们使用 block 时,我们必须创建一个使用代码运行该方法的对象的 __weak 实例,然后创建一个 __strong 实例来保留弱者还活着:

__weak __typeof(self) weakSelf = self;
[self setHandler:^{
     __strong __typeof(weakSelf) strongSelf = weakSelf;
     [strongSelf doSomething];
}];

到目前为止,很清楚,如果我们从 block 内部调用 self ,它将被自身保留并且永远不会被释放。但我的问题是,当 block 位于类方法(而不是实例方法)中时,如何处理相同的情况,例如在 UIView 动画中:

[UIView animateWithDuration:...
                      delay:...
                    options:...
                 animations:^{
                 // [self someMethod] or weak/strong reference to self [strongSelf someMethod]?
                         }
                 completion:^(BOOL finished) {
                 // [self someMethod] or weak/strong reference to self [strongSelf someMethod]?
                         }];

在这些情况下,我见过几个使用对 self 的弱/强引用的示例,但由于没有从任何实例调用完成,所以它应该保留 self,我是否遗漏了一些东西?谢谢!

最佳答案

当您的对象(自身)对 block 有强引用并且 block 对您的对象具有引用时,您需要使用weakSelf。

对于您不拥有的 UIView 类方法 - 引用此 block ,以便您可以在其中使用 self 而无需创建保留周期。该 block 将被执行,然后被释放。

关于ios - 类方法 block 上的保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38017936/

相关文章:

ios - 使用 reactivecocoa 实现 UICollectionViewDataSource 方法

objective-c - 显示警报 View 时,长按手势会被调用两次

ios - AVFoundation AVAudioPlayer 停止暂停 - Objective-C

iphone - 在 AppDelegate.m 中获取当前显示在屏幕上的 UIViewController

iPhone - 在远程推送通知对话框中查看/关闭按钮本地化

ios - 使用 Swift 删除重复的单元格 tableView

iphone - 每次从标签栏按下标签时如何执行方法?

block - 如何在 Eigen 3.3.4 中的稀疏 block 上实例化 InnerIterator?

python - 如何检查字符串是否为 rgb 十六进制字符串

c++ - 是否可以在C/C++中的for循环的增量部分进行多次操作?