1. 程式人生 > >UIViewController init方法裡面呼叫self.view的問題

UIViewController init方法裡面呼叫self.view的問題

【在UIViewController的init方法中對self.view進行設定需要謹慎】 今天在專案中用到了一個UIViewController的子類,重寫了其初始化方法,並在初始化方法中通過self.view setFrame:方法對其大小進行了修改。結果介面上的內容都沒有了,糾結了半天才恍然大悟,血的教訓啊!!! 事情是這樣子的: 以下是純記事本寫的程式碼,偽碼算是。 @interface ViewControllerA:UIViewController { } @property(nonamic,retain)ClassB * classB; @implementation ViewControllerA @sythesize classB; -(id)initWithAClassB:(ClassB *)b //假如傳進來的b的value屬性=10; { if(self = [super init]) { [self.view setFrame:CGRectMake(0,0,100,100)]; self.classB = b; //呼叫其他方法 NSLog(@"when init b.value = %d",self.classB.value); } return self; } -(void)viewDidLoad { [super viewDidLoad]; [self addSubViews]; //呼叫其他方法 NSLog(@"when didload b.value = %d",self.classB.value); //此處呼叫的方法用到了self.classB.value值,但是每次執行都發現傳進來的值並不是10,而是預設的0 } -(void)addSubViews { //程式碼塊 NSLog(@"when addSubViews b.value = %d",self.classB.value); } 結果輸出了: when addSubViews b.value = 0 when didload b.value = 0 when init b.value = 0 =================================================================== 我就納悶兒了,明明是先init再didload的呀,為什麼輸出順序是這樣子的呢? 後來好好仔細檢查了一遍程式碼,發現在self.classB = b;賦值之前呼叫了self.view,這個時候self.view還沒有,所以要去先載入view,所以導致了這種情況。以前瞎寫,完全沒有注意到有這個問題,今天漲姿勢了。。。