ios - block 中的 WeakSelf

标签 ios objective-c

有一个关于 weak self 、 blocks 和 retain cycle 的问题。

根据这本书,我明白我们需要在 block 中使用 weakself.. 问题是,什么时候?

例如,简单的动画代码,从不包含weakself..

self.myView.alpha = 1.0;
[UIView animateWithDuration:0.2 animations:^{
self.myView.alpha = 1.0; 
}];

这段代码可以吗?或者我应该在 block 之前创建一个 weakself 并在内部使用它?

在我所有的代码和我曾经从事过的所有其他项目中,从未见过使用 weak self 的一行。 我现在正尝试在每个街区使用 weakself .. 只是我不确定是否有必要

期待您的意见 谢谢

最佳答案

当存在保留循环的可能性时,您应该使用 weak selfs。

假设 foo 的一个实例对 bar 有一个强引用。现在你给 bar 一个引用 foo 自身的 block 。现在有人释放了 foo,但是 bar 保留了这个 block 。现在 foo 对 bar 有强引用,而 bar 对 block 中的 foo 有强引用。 Foo 不会被释放,因此 bar 也不会被释放,因为 bar 一直持有它。但是唯一保留在 bar 上的是现在未使用的 foo。您有一个保留周期,这两个对象现在漂浮在无法访问的内存中。

UIView 的动画没有问题,因为 block 在 animate: 方法返回之前被调用,并且 UIView 不会保留 block 。

ARC 通常会在发现可能存在循环保留时警告您。但情况并非总是如此。一个好的经验法则是,当您不知道 block 将在哪里结束时使用弱 self 。

希望对您有所帮助。

关于ios - block 中的 WeakSelf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839071/

相关文章:

iphone - 我怎么能创建一个类似于这个的自定义标签栏

iPhone:如何将包含公钥位的 SecKeyRef 或 NSData 导出为 PEM 格式?

ios - 带有 xib 的 UIViewController 的单例

ios - 带约束的 Swift 圆形按钮

ios - 如何快速打开电影画廊

objective-c - UIAlertView 不会调用函数

objective-c - 如何以编程方式设置 WKInterfaceButton 字体?

ios - Google Analytics 手动安装 libz.dylib

ios - UILocalNotifications 未按计划触发

iphone - 当表格重新出现时,UITableView 不会自动取消选择选定的行