2012-05-18 69 views
1

我有一個ViewController被推到NavigationController堆棧。一旦它被推入堆棧,它就開始下載一些圖像,通過一個下載器對象來負責下載後臺線程中的圖像。圖像可能需要幾秒鐘,即使通過WiFi下載。當圖像完成下載時,下載器對象指示ViewController佈置其圖像,將新下載的圖像放到分頁的UIScrollView的背面。然而,在這段時間內,用戶可能已經按下「後退」按鈕,並且ViewController現在可能已被釋放/解除分配,因此下載器對象將導致SIGABRT錯誤消息,並且應用程序將崩潰。如何處理ViewController被釋放後,射出背景線程,現在釋放ViewController?

我應該如何處理這種情況?有沒有辦法檢查釋放/釋放的實例?或者以某種方式來捕捉錯誤和日誌,然後忽略它呢?

回答

3

最好的辦法是使用調零弱參考。當然,對於iOS 5.0,這只是一個「弱」的參考。但是,如果你的目標是iOS 5.0以下,那麼你需要一個自定義的解決方案。文章中有一篇由Mike Ash在this文章中描述的很好的文章。

1

也許你可以通過使用通知來避免這個問題?而不是你的下載器對象引用viewController,它會發佈一個通知,viewController(如果它已加載)響應該通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshMyLayout) name:@"allDataLoaded" object:nil]; 
在您的視圖控制器的dealloc

[[NSNotificationCenter defaultCenter] postNotificationName:@"allDataLoaded" object:nil]; 
在您的視圖控制器的viewDidLoad

在數據加載對象

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

你甚至可以把一個反向通知從你viewController的viewDidUnload中告訴數據下載者取消下載廣告(如果你想)。

+0

也許在某些情況下,這將會很有用,但我實際上將下載的數據存儲在數據庫中,無論它是否顯示成功,因此終止下載實際上會反作用 - 感謝提示,儘管使用通知而不是代表可能會在某些時候有用。 –

0

一旦結果不再需要,最好的辦法是取消下載。這可以防止不必要的數據流量和內存消耗

如果你不能做到這一點,下載對象都應該擁有某種委託的(你的看法可能是控制器),當你不再感興趣的結果(例如,在您的視圖控制器的dealloc,你可以設置爲nil方法)。如果您定位iOS 5,則清零弱引用也是一種選擇,但同樣,取消下載NSURLConnection會更好。

相關問題