1. 程式人生 > >先有雞,還是先有蛋?相互引用的奇遇!

先有雞,還是先有蛋?相互引用的奇遇!

"世界上到底是先有雞後有蛋,還是先有蛋後有雞?"這是一個古老的哲學命題。
幾千年來,許多哲人都曾試圖解答這個問題,然而又都找不出令人信服的論據,所以直至今天,這個問題仍然沒有定論。 
--在程式設計的世界裡,也是有著這麼一個傳說:兩個類相互引用,那到底是先引用哪個類呢?
剛剛在編碼的時候就遇到了這麼一個奇特的問題,互相引用的兩個類,程式碼似乎寫得沒什麼問題,但一旦編譯就出錯了…這點,在最終解決了Error及Waring之後還是解答不了。
情景還原:由於業務需求,需要用到兩個檢視的相互跳轉,因此需要分別對兩個類進行引用,所以做如下編碼。
AccountViewController.h檔案原始碼
#import <UIKit/UIKit.h>
#import "AccRegViewController.h"

@interface AccountViewController : UIViewController
-(IBAction) btnLoginClick:(id)sender;
-(IBAction) btnWClick:(id)sender;
@property (nonatomic,retain) IBOutlet UITextField *txtName;
@property (nonatomic,retain) IBOutlet UITextField *txtPwd;
-(void) doReg;
@property (nonatomic,retain) AccRegViewController *regView;
@end
AccRegViewController.h檔案原始碼
#import <UIKit/UIKit.h>
#import "AccountViewController.h"

@interface AccRegViewController : UIViewController
@property (retain ,nonatomic) AccountViewController *loView;
-(void) doLogin;

@end
這樣寫似乎沒什麼錯誤,但一旦編譯,機智的編譯器就會這麼說:
這沒錯啊!!!腫麼會醬紫?
於是…把import分別改成了class試試…
@class AccRegViewController;
@class AccountViewController;
好啦,這樣應該沒問題了把!
但這次機制的XCODE把ERROR去掉了,給俺來了幾個WORING!……
這不合適吧,少年,編碼容易嘛,別動不動就error woring的,真是受不鳥啊~
------------------解決方案-------------------
最終的解決方案是:
在各子的實現檔案即.m中對兩者的標頭檔案都進行引用
#import "AccRegViewController.h"
#import "AccountViewController.h"
這樣的話就把兩者都相互引用了,nice啊,這個程式碼在我個人看來太有意思了。
直到現在,我還是不清楚哪個類先引用了另一個類,但能肯定一點的是BUG解決了。