眾所周知,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...