3

我推UIViewControllerUINavigationController。這個視圖控制器立即開始下載一個XML feed,然後解析它。但是,如果在完成下載之前點擊後退按鈕,並且使用EXC_BAD_ACCESS進行崩潰。被撞毀它的線路是parserDidEndDocument,是這一行:的UIViewController從視圖堆棧中彈出和NSURLConnection的崩潰應用

if (self.delegate && [self.delegate conformsToProtocol:@protocol(ModelDelegate)]) [self.delegate modelDidFinishParsing:self]; 

我認爲它崩潰,因爲它試圖訪問其不再被分配self.delegate。我如何解決這個問題?

另外,我將釋放模型對象在modelDidFinishParsing方法。如果它從未達到此方法,我將如何發佈此模型。

回答

1

我設置了對象來處理AppDelegate中的下載(以及其他異步或長時間運行的任務),然後根據需要從各個控制器中觸發它們。這樣他們在應用程序的整個生命週期中擁有並保持持久性。

做到這一點的最好方法是將它們傳遞給需要它們的viewControllers(而不是viewController「期待」appDelegate有這樣一個對象準備好並等待) - 依賴注入。

這些對象更新我的模型在某種程度上,當他們完成,如果我需要,我用NSNotifications宣佈他們這樣做。這使我從我曾經嘗試取消或交換委託在viewWillDisappear等混亂的混亂,以避免您遇到的問題類型。

0

您的應用程序崩潰的原因可能是因爲NSURLConnection的保留其委託(這樣它可以可靠地打電話回去吧),但反對該委託具有弱引用已被釋放。

也就是說,在你的情況可能已經在視圖控制器被彈出釋放什麼self.delegate點,但委託財產沒有被清除(設置爲無)。

的解決問題的方法是清除(無)self.delegate在當UIViewController子類被彈出導航堆棧的適當時間。

備註:保留委託對於Cocoa類來說不是常見的行爲。在發生與標準實踐相反的情況下,將其記錄下來(參見NSURLConnection文檔)。