2011-08-05 135 views
1

我有一個類instanciate另一個類,並作爲第二類的代表。第二類是「自由」的,並且不被第一類保留。iPhone - 更改委託可能會導致異步調用崩潰?

這第二類異步發送HTTP請求,並聽取他們的反應。
收到響應後,會對其進行解析,並將結果重新打包併發送給其中一個委託方法。一旦委託被調用,第二個類實例將自行釋放。演出結束。

就一定要獲得服務器的答案,在第一類中的dealloc進入(因任何原因),它改變了第二個的委託屬性設爲路線答案applicationdelegate。

但是......改變這種委託屬性的時候,我認爲這是一個機會,HTTP答案是異步可與第一類的dealloc過程中發生碰撞。所以第一堂課會在釋放時收到答案。在這種情況下,第一個班級會收到一個它無法管理的答案(可能會崩潰),第二個班級在調用發送到第一個班之後,永遠不會看到委託人已經更改。

你會如何管理較具體來說這個問題?

下面是過程的模式:

  • AppDelegate中創建A1,A2,A3。
  • 每個斧創建乙實例對象(B1,B2,B3的是發送HTTP請求),並且每個斧被定義爲在該點Bx的
  • 的委託,所有A和B類的實例可以具有他們的生活
  • 如果斧實例終止,在BX類可能的答案發送到的appdelegate代替斧實例

回答

2

你有,如果一個委託一個問題,但一個是不允許保留B

  1. 必須已知是委託仍然存在,或者在需要時設置爲nil
  2. A必須知道B仍然存在,否則它不能安全地將自己作爲代表自行刪除。

所以,要麼去除保留限制,讓一個妥善保留

或去使用通知不太耦合求解。

  1. B定義一個通知,並張貼在它上面。
  2. A註冊爲創建通知的偵聽器,並取消註銷取消註冊。
+0

最後的解決方案是我打算做的。但是......在B被通知A正在死亡的延遲期間,它可能會將答案發送給A,A和B必須有dinstinct的生命。一個人必須能夠在另一個之前死去。但是......當A死亡時,B必須知道它必須將答案發送給應用程序委託(不能在那裏使用通知,因爲當A實例中的一個實例死亡時,A的任何實例都可以捕獲通知來代替appdelegate)。你也可以看到我的編輯。 – Oliver

+1

@Oliver - 通知分派是同步的。在通知進行過程中,** A **和** B **都不會死亡。 ' - [NSNotificationCenter post ...]方法甚至不會返回,直到所有已註冊的觀察者被調用並完成他們的工作。 – PeyloW

0

就一定要獲得服務器的答案,在第一類中的dealloc進入(因任何原因),它改變了第二個的委託財產路由的答案,應用程序委託。

這聽起來不像一個合理的建築給我。以你應該沒有必要的方式來跟蹤代表。將與服務器通信的代碼分解爲自己的類,只要您需要它,它就會持續存在。不要將您的網絡代碼傳播到您的應用程序中,而是始終來來往往的對象中,並且不要將您的應用程序委託視爲捕獲任何東西,只要您需要多個地方可用的東西。

+0

你說:「不要將你的網絡代碼傳播到你的應用程序中,而是一直在來來往往的對象中」。這是正確的,這就是我所做的,但只有一個不好的呼叫只有一個dealloc可能會導致應用程序崩潰。這不是非常用戶友好的,即使它應該以統計方式發生。 – Oliver

+0

我不確定你在說什麼,你能改說嗎?這與用戶友好無關。 – Jim

+0

我的意思是,沒有必要在物體來去不前的情況下崩潰。只需調用一次持久對象,即可實現一次運行,而且運行起來也不錯,而且應用程序也會崩潰。這是我談論的非用戶友好方面(崩潰) – Oliver