2014-11-05 68 views
2

卸載self.view據View Controller Programming Guide,我們可以明確地分配到nil卸載self.viewUIViewControllerself.view如何從UIViewController的斯威夫特

但是在斯威夫特,在UIViewControllerview屬性被聲明爲

var view: UIView 

這不是UIView!,因此下面的代碼不編譯

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    if self.view.window == nil { 
     self.view = nil 
     //  ^Type 'UIView' does not conform to protocol 'NilLiteralConvertible' 

    } 
} 

是否有另一種方式做到這一點的斯威夫特?

+0

self.view.removeFromSuperview() – 2014-11-05 12:13:57

+0

@ArturKucaj:...是完全不同的東西。 – DarkDust 2014-11-05 12:22:58

回答

4

setValue(nil, forKey:"view")似乎工作:

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    if self.view.window == nil { 
     self.setValue(nil, forKey: "view") 
    } 
} 
+0

'view'屬性不允許設置nil可能是審計過的Swift API中的一個錯誤。 (根據蘋果開發者論壇上的建議,你應該在[title]中使用#IUO [提交bug](http://bugreport.apple.com)。)這是一個很好的解決方法。 – rickster 2014-11-10 20:33:17

+3

'self.view = nil'現在可以工作 – Gob 2015-09-16 22:04:34

1

您不再需要卸載該視圖。這就是爲什麼-[UIViewController viewDidUnload]已被棄用。 documentation說:

在iOS 6.0中不贊成使用。視圖不再在低內存條件下清除,因此此方法從不被調用。

視圖控制器編程指南,它說:

使用一個視圖中繪製自己的記憶屏幕上的是潛在的相當大的。但是,當視圖未附加到窗口時,系統會自動釋放這些昂貴的資源。大多數視圖使用的其餘內存足夠小,以至於系統不能自動清除並重新創建視圖層次結構。

換句話說:如果視圖層次結構被附接到一個窗口,它可以消耗大量的存儲器。但是,如果視圖層次結構沒有附加到窗口,它很便宜。

所以答案是:不要試圖卸載您的視圖。無論如何,它不會給你太多回憶。當然,如果您可以釋放任何可以恢復/重新計算的對象(如緩存),請在didReceiveMemoryWarning中執行此操作。

+0

我理解爲什麼意見不再自動發佈。但是,我想在'viewDidLoad'中集中所有資源的初始化過程。所以當我釋放一些東西的時候,我也想釋放'view'。 – rintaro 2014-11-06 03:05:47

+0

即使視圖自動釋放,並且視圖層次本身不會維護成本高昂的資源,但仍然有價值的是無視視圖控制器的主視圖:許多VC集中了viewDidLoad中的狀態設置。這可能包括重量級非視圖層次狀態數據,並且視圖層次結構中的任何自定義視圖也可能引用非視圖數據。從軌道上剔除它是一種方法,可以確保a)它全部消失,並且b)一旦它再次需要時,它們都會在正常初始化的相同代碼路徑上重新初始化。 – rickster 2014-11-10 20:39:13