gpt4 book ai didi

ios - ARC、自身和 block

转载 作者:可可西里 更新时间:2023-11-01 03:06:55 25 4
gpt4 key购买 nike

我想我明白在复制的 block 中使用 self 是不行不行

但是为了清理我的代码,我在 Xcode 中启用了一堆警告,一个叫做“向弱指针发送消息”

所以现在在我所有的 block 中,每次我使用我创建的 weakself 引用 __weak typeof(self) weakself = self;

我收到此警告:Weak receiver may be unpredictablely set to nil

一个简单的例子:

__weak typeof(self) weakself = self;
[aClass doSomethingInABlock:^{

[weakself doSomething]; //warning.

}];

我看到了在 block 中定义 self 版本的答案,如下所示:

__weak typeof(self) weakself = self;
[aClass doSomethingInABlock:^{
typeof(self) selfref = weakself;
[selfref doSomething]; //no warning.

}];

所以我想知道这里到底发生了什么:

  • 我是不是在欺骗编译器?
  • 对弱引用的强引用有什么作用?
  • 还有什么我想念的。

谢谢。

最佳答案

I thought I understood the usage of self in a block is a no no.

这并不完全正确。 block 保留其中的对象,因此如果您的 block 由 self 保留,则不要在 block 中使用 self

例如,您可以在 UIView 动画 block 中使用 self。这是因为您的 View Controller (或任何调用动画的代码)没有指向 UIView 动画 block 的指针。)

Am I just tricking the compiler?

没有。

What does a strong reference to a weak reference do?

如果弱引用不是nil,则增加接收者的保留计数。这将阻止对象在您使用时被释放。

请记住,ARC 将在不再有对对象的强引用时释放对象。通过在 block 内创建强引用,您可以防止可能的释放,直到您完成它。

anything else I'm missing.

我推荐阅读 Practical Memory Management section高级内存管理编程指南。特别是,请阅读“使用弱引用来避免保留循环”小节。

关于ios - ARC、自身和 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339490/

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