我遇到了派生類在其initWithNibName調用中設置超類定義的屬性的問題,並且在調用viewDidLoad時,該屬性再次神奇地未定義。它會是這樣的:在init中設置的屬性在viewDidLoad之後是否正確?
@interface BaseClassController : UIViewController
{
}
@property (copy, nonatomic) NSString *myString; // synthesized in the .m
在另一個文件
@interface DerivedClassController : BaseClassController
{
}
,並在其執行:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
NSLog(@"Setting MyString stuff");
self.myString = @"Hi Mom";
NSLog(@"Done setting myString");
}
return self;
}
- (void)viewDidLoad
{
NSLog(@"MyString is %@", self.myString); // output as (null)!!!
[...]
}
根據的NSLog輸出的順序是正確的,我知道的一個事實該viewDidLoad不被首先調用:首先是initWithNibName方法,然後是viewDidLoad。 viewDidLoad每一次都將self.myString報告爲(null)。但是,如果我將myString的初始化向下移動到viewDidLoad,則一切正常。爲什麼?我必須失去了一些東西在這裏真的很明顯..
編輯:
不知道這是否有差別,但DerivedClassController是,就是BEING模態呈現(用於各種導航控制器的根視圖控制器遺留原因)。
編輯2:
代碼將按預期在一個獨立的Xcode項目,它在導入到項目中,我最終會需要使用它失敗。
不管你信不信,剛好也發生在我身上。在''init''中設置的屬性在''viewDidLoad''中爲零。我試圖通過直接設置'_myString'來使用合成存取器,但是沒有用。這真的很難調試,因爲這不是編程錯誤。 – Moritz