2012-03-15 60 views
0

我創建了一堆用於管理多個自定義對象的UIViewControllers。雖然我不需要直接訪問「UIViewController」,但它從創建的位置開始。我想添加viewController.view到我的主UIViewController的視圖。然後我釋放subViewController。 SubViewController中有一個手勢識別器,當我去執行一個手勢時,我得到了一個消息發送到解除分配的實例。保留一個UIViewControllers's.view,然後釋放VC,VC獲取dealloc'd?

這是我的代碼。

[...snip...] 
    for (int elementForPageTypeIndex = 0 ; elementForPageTypeIndex < elementsOnPage; elementForPageTypeIndex ++){ 


      IoUIElementPickerElementButtonViewController * element = [[IoUIElementPickerElementButtonViewController alloc] initWithNibName:@"IoUIElementPickerElementButtonViewController" bundle:nil]; 

      pageColumn = (elementForPageTypeIndex)%2 ; 
      pageRow = roundf((elementForPageTypeIndex)/2); 

      CGRect elementFrame= CGRectMake(kElementPickerColumnLeftOffset + (element.view.frame.size.width + kElementPickerColumnSeperation)*pageColumn + pageIndex*kElementPickerColumnPageOffset, 
              kElementPickerRowTopOffset + (kElementPickerRowSeperation + element.view.frame.size.height) * pageRow, 
              element.view.frame.size.width, 
              element.view.frame.size.height); 

      [element.view setFrame:elementFrame]; 

      SysCDElement *ourCDElement = [elementsForPage objectAtIndex:elementForPageTypeIndex + maxElementsPerPages * pageIndex]; 

      [scrollViewContent addSubview:element.view]; 
      [element release]; 

    } 
[...snip...] 

發佈後權,element的dealloc的運行。我認爲,如果我保留一個ViewController的視圖,也可以保留ViewController本身?

謝謝,

回答

2

沒有。如果保留UIViewController的視圖還會奇蹟般地保留UIViewController,那將是非常可怕的。

經驗法則是,如果你需要某些東西來保持活力,你會保留它。如果你仍然需要它,永遠不要釋放它。指望其他類保留它並不可靠。如果你想控制器留在身邊,不要釋放它。

+1

說得好。這裏的「保留」通常意味着「堅持保留ivar」。 – 2012-03-15 02:38:55

+0

謝謝,視圖控制器的質量感。關於常規UIViews的經驗法則。這個規則是否也適用?例如。我創建了一個工具欄,上面有6個BarButtonItems。根據某個事件,我想更改其中一個barButton項目的圖標。我通常創建按鈕,設置屬性,添加到項目數組,然後釋放。我在這裏做同樣的事情,雖然我保持指向BartButton Item的iVar知道ToolBar保留它,即使我發佈了我創建的版本。這可以接受嗎? – scooter133 2012-03-15 14:36:29

+0

@ scooter133,這取決於上下文。如果您稍後參考條形按鈕項目,並對其代表的內容有一定的期望,那麼您應該保留對它的引用。如果您只想設置工具欄項目,然後沿着您的快樂方式行事,那麼創建它們然後將概念所有權轉移到工具欄即可。 – 2012-03-15 18:57:13