gpt4 book ai didi

iPhone - 更改委托(delegate)可能会导致异步调用崩溃?

转载 作者:行者123 更新时间:2023-11-29 11:21:30 24 4
gpt4 key购买 nike

我有一个实例化另一个类的类,并作为第二个类的委托(delegate)。第二类是“免费”的,第一类不保留。

第二个类发送异步 HTTP 请求并监听它们的响应。
收到响应后,将对其进行解析,并将结果重新打包并发送到其中一个委托(delegate)方法。一旦委托(delegate)被调用,第二个类实例就会自行释放。演出结束。

为了确保获得服务器应答,当第一个类进入 dealloc 时(出于任何原因),它会更改第二个类的委托(delegate)属性以将应答路由到 applicationdelegate。

但是...当更改该委托(delegate)属性时,我认为异步的 http 应答有可能与第一类的 dealloc 进程发生冲突。所以头等舱在解除分配时会收到一个答案。在这种情况下,第一个类会收到一个它无法管理的答案(可能会崩溃),而第二个类将永远不会看到委托(delegate)在调用发送到第一个类后立即发生了变化。

您将如何具体解决该问题?

这是一个过程的架构:

  • AppDelegate 创建 A1、A2、A3。
  • 每个Ax创建一个B实例对象(发送HTTP请求的B1、B2、B3),每个Ax定义为Bx的委托(delegate)
  • 至此,所有A类和B类实例都可能有生命了
  • 如果 Ax 实例死亡,Bx 类可能会将答案发送给 appdelegate 而不是 Ax 实例

最佳答案

如果 AB 的委托(delegate),但不允许 A 保留 B,你就会遇到问题>.

  1. B 必须知道委托(delegate) (A) 仍然存在,或者在需要时设置为 nil .
  2. A 必须知道 B 仍然存在,否则它无法安全地移除自己的委托(delegate)。

所以要么取消保留限制,让A正确保留B

或者使用通知寻求耦合度较低的解决方案。

  1. B 定义一个通知,并在上面发布。
  2. A 在创建时注册为通知的监听器,并在释放时注销。

关于iPhone - 更改委托(delegate)可能会导致异步调用崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6956904/

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