2010-06-04 90 views
1

不知道這是否是一個愚蠢的問題,但我需要多少次加載任何特定的筆尖?我需要加載一個筆尖多少次?

我的理解是,您在加載時正在有效地解除對筆尖的存檔,隨後可以隨時進行初始化嗎?

例子:

controlsViewController *controls = [[controlsViewController alloc] initWithNibName:@"controlsViewController" bundle:nil]; 
[self addSubview:controls.view]; 

然後,後來我釋放這個視圖 - 控制:

[controls release]; 

下一次我想初始化這個視圖 - 控制型,我用筆尖或只是「INIT?

回答

1

Spadict,這裏有一些錯誤。首先,我關心比大多數人都少的挑剔,但它有助於讓語言正確。真的是這樣。讓我們慢慢來吧..

如果你有一個類'ControlsViewController'(注意大寫C),你可以隨時使用它。你可以實例化儘可能多實例只要你喜歡,只要你喜歡。閱讀UIViewController的文檔(我在這裏假設ControlsViewController是一個你寫的類,它是UIViewController的一個子類)告訴我們指定的初始化器是-initWithNibName:bundle:。這意味着我們通常會像這樣使用它: -

ControlsViewController *controls = [[ControlsViewController alloc] initWithNibName:@"aNib" bundle:nil]; 

另一種創建類實例的方法是使用Interface Builder。在界面生成器中,您可以創建任意多個您喜歡的類的實例,調整它們的屬性,然後按原樣將它們保存爲一個nib文件。這是創建GUI實例,窗口,按鈕,視圖等的好方法,因爲您可以通過視覺操作位置和大小,並且可以通過拖放操作將按鈕添加到視圖或視圖中,這比編碼更容易。

.nib文件與.zip文件相當。我們並不關心.nib文件 - 我們關心我們存檔在其中的對象的實例。我們不是unarchiving .nib文件,我們將我們用Interface Builder創建的對象解除存檔,然後將其存檔爲nib文件。

每次我們加載筆尖文件我們會重新創建裏面的對象,就像我們保存筆尖時一樣。作爲一個例子: - 在界面生成器中,我創建一個窗口,並將背景顏色設置爲黑色,寬度爲600px。我把它保存到一個筆尖(在這個筆尖中有一個窗口對象 - 但是對於多少個對象或什麼類型沒有限制)。

當我運行應用程序我加載.nib 5次。我現在有5個寬度爲600px的黑色背景的Windows。

UIViewController的指定初始化程序將第一個參數作爲筆尖的名稱。當我們創建一個UIViewController的實例時,它會調用'-loadView'來加載我們傳入的nib,並將其中的對象解除歸檔。你永遠不需要調用'-loadview',並且使用一個筆尖不能替代這種方法。

因此,一個視圖可以通過編程方式創建,或者使用Interface Builder創建,然後從nib中加載。這些「都不涉及以編程方式繪製視圖」。一旦你有了一個觀點,你可以讓它畫出來,你可以每秒做50次,或者你可以做一次,但這是一個單獨的操作。

+0

我對這種居高臨下的態度並不熱衷,但我的確把你的駱駝套的建議放在心上,它顯着提高了我的編碼的清晰度。 幾個月後,我記得這一點,並已回到upvote你。乾杯。 – bitwit 2011-01-02 23:50:03

1

我想我已經想通了,所以我會嘗試回答我自己的問題。

每次初始化想要使用它的視圖控制器時,都需要加載筆尖。加載一個nib是UIViewController的'loadView'方法的替代方法,它涉及以編程方式繪製視圖。

筆尖不是一個對象類,它不像NSObject那樣初始化到內存中。它只是一個存檔的替代方案,以編程方式加載視圖,並且每次需要在視圖控制器中使用它時都需要加載。

任何人都可以確認或否認?

0

Nib文件只是一組已經被序列化的用戶界面對象。當您執行[controller initWithNibName:@"file"]時,對象將從文件重建到內存中。 Interface Builder的文件所有者controller對象正在發送的消息。因此,在加載筆尖時,無論您從文件的所有者到「界面」構建器中的視圖所做的任何連接都連接到controller對象。至少這可能是view財產UIViewController

所有這些的結果是當你做時[controller release]controller對象也將釋放它的所有引用,其中包括從nib加載的那些對象。所以是的,你將需要重新加載筆尖,因爲所有這些對象都被釋放。

一句警告。我看到你在做[self addSubview:controls.view]。如果在釋放控制器之前沒有執行類似[controller.view removeFromSuperview]的操作,那麼基本視圖仍然保存對所有內容的引用。 (至少我認爲是這樣。)