initWithNibName導致的初始化問題

2021-06-03 15:14:05 字數 2378 閱讀 4798

眾所周知,ib在載入nib的過程中存在著一些undocument行為,有的行為確實是不可理喻的,因此程式設計師對ib產生了抗拒心理。

今天我們要介紹的是ib導致的乙個奇特行為。通過本文的描述, 作者完美地展示了ib給物件導向所帶來的破壞作用。

我們有兩個view controller,暫名為superclass和subclass。subclass繼承了superclass。在superclass的initwithnibname初始化方法中,我們這樣寫道:

self = [super initwithnibname:nibnameornil bundle:nibbundleornil];

if (self) {

[self setwords:@」somebody is knocking」];

return self;

在superclass的viewdidload方法中,我們這樣寫:

[super viewdidload];

nslog(@"get ***:%@", [self words]);

然後我們用subclass繼承superclass。在initwithnibname方法中,我們寫入:

self = [super initwithnibname:nibnameornil bundle:nibbundleornil];

if (self) {[

[self setwords:@」 pleaseanswer the door」];

很顯然,我們通過覆蓋initwithnibname方法,修改了從superclass繼承來的words屬性。如果我們想列印pleaseanswer the door這段文字,你可能會想重用superclass的viewdidload方法:

- (void)viewdidload{

[super viewdidload];  

好了,執行程式。在載入superclass.xib時,控制台將列印somebodyis knocking。而載入subclass.xib時,控制台會列印please answer the door。

hey,等一等。為什麼我會在兩個viewcontroller中都看到了somebody is knocking?

不用看了,subclass物件的words屬性確實是pleaseanswer the door。如果你正在除錯**,那麼可以debug區中確認這一點。

問題在於subclass的初始化出現了問題。看這一句:self=[superinitwithnibname:nibnameornil bundle:nibbundleornil];

這句**將導致ib載入nib檔案,並立即呼叫viewdidload方法。我們可以看到在初始化subclass時的呼叫順序如下:

1. subclass->initwithnibname

2. superclass->initwithnibname

3. superclass->setwords

4. subclass->viewdidload

5. superclass->initwithnibname

6. subclass->setproperty

讓我再解釋一下:

1. 首先subclass的initwithnibname方法呼叫。

2. 接著呼叫superclass的initwithnibname方法。

3. 在superclass的initwithnibname方法中,words屬性被設定為somebodyis knoking。

4. superclass的initwithnibname方法結束,表示nib檔案已載入,則呼叫nib檔案的file』sowner所指向的 viewdidload方法。注意,這時的nib檔名應為subclass.nib,於是應呼叫[subclass viewdidload]方法。

5. subclass的viewdidload方法又呼叫了supclass的viewdidload方法。於是控制台列印出的是words屬性的當前值somebodyis knoking。

6. 最後才是initwithnibname方法剩餘的**,在這裡我們將words屬性修改為pleaseanswer the door。但為時已晚,在此之前viewdidload已經執行結束。

解決的辦法是簡單的,不要在initwithname方法中修改從父類繼承來的屬性,相反,我們可以在[super iewdidload]之前這樣做:

- (void)viewdidload{

[selfsetwords:@」 pleaseanswer the door」];

[super viewdidload];  

結論由於initwithnibname或者是ib 這些限制,.nib檔案違反了物件導向的原則。.nib檔案無法從另乙個.nib檔案繼承。不管你的類如何繼承,但nib檔案中不會儲存類的層次結構,file』sowner也無法指向類鏈。

initWithNibName導致的初始化問題

眾所周知,ib在載入nib的過程中存在著一些undocument行為,有的行為確實是不可理喻的,因此程式設計師對ib產生了抗拒心理。今天我們要介紹的是ib導致的乙個奇特行為。通過本文的描述,作者完美地展示了ib給物件導向所帶來的破壞作用。我們有兩個view controller,暫名為supercl...

initWithNibName導致的初始化問題

眾所周知,ib在載入nib的過程中存在著一些undocument行為,有的行為確實是不可理喻的,因此程式設計師對ib產生了抗拒心理。今天我們要介紹的是ib導致的乙個奇特行為。通過本文的描述,作者完美地展示了ib給物件導向所帶來的破壞作用。我們有兩個view controller,暫名為supercl...

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...