2013-10-28 24 views
1

我正在瀏覽一些舊代碼,並試圖檢測一些難以發現的錯誤。我遇到了一個UIViewController的異常用法,其中控制器被分配,存儲在一個屬性中,並且它的視圖被添加爲子視圖,而不是呈現整個控制器。非常規UIViewController用法的危險

讓我先說,我知道這是一種哈克和異常的開始。那就是說,在下面的實現中有什麼危險?是否有任何意想不到的副作用? MyOtherViewController如果由於在某個時候收到內存警告而卸載其視圖並重新創建它,那麼會發生什麼奇怪的行爲?

​​

回答

1

看看顯示視圖控制器編程方式的內容

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingViewControllersinYourApplication/UsingViewControllersinYourApplication.html#//apple_ref/doc/uid/TP40007457-CH6-SW8

注意這一點:重要提示:切勿視圖控制器的視圖直接安裝到一個視圖層次結構。

+0

基本上說,從來沒有這樣做的方式,我做這件事很直接,很好找。我最終採取蘋果的「創建自定義容器視圖控制器」指南非常仔細地看,發現這裏和實施這樣的事情:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers。 HTML#// apple_ref/DOC/UID/TP40007457-CH18-SW6 – MikeS

2

你正在做的是創建自定義視圖控制器容器。這不是一件壞事,但你並沒有按照你應該的方式去做。 UIViewController的類引用中有一個section,它解釋瞭如何完成你想要做的事情。

+0

我喜歡這個答案,它指出我可以/應該怎麼做,但它並沒有解決我對上面做的事情的危險(如果有的話)的問題。 +1,但不能接受爲答案。 – MikeS

0

我只是找到了一個討厭的壞EXEC墜毀在一個項目中,我搬到了(見下文討厭的錯誤)。

我可以說,使用一個UIViewController是非常糟糕的,因爲:

  • 你必須確保控制器不釋放。該視圖不會因爲它在視圖層次結構中具有超級視圖,但控制器沒有保留它的對象。如果它被添加到窗口作爲rootController,到一個選項卡控制器,導航控制器或由另一個控制器(正常使用)呈現它可以。

  • 它不會收到方向的變化和消息,你希望得到所謂的除了viewDidLoad中。

  • 討厭的錯誤。例如,在iOS 5中,如果在解除模態控制器之前未釋放此控制器,那麼您將遇到BAD EXEC崩潰,這會使您發瘋。看起來,SDK中的動畫方法期望您的視圖控制器在排除模態動畫期間出現。