Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-更改代理可能导致异步调用崩溃?_Iphone_Ios_Memory Management_Asynchronous_Delegates - Fatal编程技术网

iPhone-更改代理可能导致异步调用崩溃?

iPhone-更改代理可能导致异步调用崩溃?,iphone,ios,memory-management,asynchronous,delegates,Iphone,Ios,Memory Management,Asynchronous,Delegates,我有一个类实例化另一个类,并作为第二个类的委托。第二类是“免费”的,第一类不保留 第二个类发送异步HTTP请求并侦听它们的响应。 当接收到响应时,将对其进行解析,并将结果重新打包并发送到其中一个委托方法。一旦调用委托,第二个类实例就会释放自己。节目结束了 为了确保获得服务器答案,当第一个类进入dealloc(出于任何原因)时,它会更改第二个类的委托属性,以将答案路由到ApplicationLegate 但是。。。在更改委托属性时,我认为异步http应答可能会与第一个类的dealloc进程冲突。因

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

第二个类发送异步HTTP请求并侦听它们的响应。
当接收到响应时,将对其进行解析,并将结果重新打包并发送到其中一个委托方法。一旦调用委托,第二个类实例就会释放自己。节目结束了

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

但是。。。在更改委托属性时,我认为异步http应答可能会与第一个类的dealloc进程冲突。因此,第一个类在释放时将收到一个答案。在这种情况下,第一个类将收到一个它无法管理的答案(可能会崩溃),而第二个类将永远不会看到在调用发送给第一个类之后,代理发生了更改

你将如何具体处理这个问题

以下是流程的模式:

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

如果aB的代表,但a不允许保留B,您的问题就出现了

  • B必须知道代理(A)仍然存在,或者在需要时设置为
    nil
  • A必须知道B仍然存在,否则它无法安全地将自己作为代理移除
  • 因此,要么取消保留限制,让A正确保留B

    或者选择使用通知的耦合度较低的解决方案

  • B定义一个通知,并在其上发布
  • A在创建时注册为通知的侦听器,并在释放时取消注册
  • 为了确保获得服务器答案,当第一个类进入dealloc(出于任何原因)时,它会更改第二个类的委托属性,以将答案路由到应用程序委托


    对我来说,这听起来不像一个合理的架构。不需要像你这样玩弄代表。将与服务器进行通信的代码分解为它自己的类,该类可以在需要时保持多久。不要将你的网络代码散布在你的应用程序中,因为这些对象总是来来去去去,也不要在你需要在多个地方可用的东西时将你的应用程序代理视为一个包罗万象的东西。

    最后一个解决方案就是我计划要做的。但是在B被通知A即将死亡的延迟期间,它可能会将答案发送给A。A和B必须有生命。一个人必须能够先于另一个人死去。但是当A死亡时,B必须知道它必须将答案路由到app delegate(不能在那里使用通知,因为当一个实例死亡时,A的任何实例都可以捕获通知而不是appdelegate)。您还可以看到我的编辑。@Oliver-通知调度是同步的。通知进行期间,A和B都不能死亡。
    -[NSNotificationCenter post…]
    方法在调用所有注册的观察者并完成其工作之前都不会返回。您说“不要将您的网络代码传播到您的应用程序中随时都会出现的对象中”。没错,我就是这么做的,但一次dealloc只有一次错误呼叫可能会导致应用程序崩溃。这对用户不是很友好,即使它是以统计的方式发生的。我不确定你在说什么,你能重新措辞吗?这与用户友好无关。我只是说,没有必要在对象总是来来去去去的环境中崩溃。只要用一个持久性对象调用一次,如果运气不好,应用程序也会崩溃。这是我所说的非用户友好的方面(崩溃)是的,崩溃可以以多种不同的方式发生。那又怎么样?我不明白你为什么认为这意味着你需要为你的应用程序避免一个合理的架构。