2012-09-20 51 views
1

我遇到了派生類在其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項目,它在導入到項目中,我最終會需要使用它失敗。

+0

不管你信不信,剛好也發生在我身上。在''init''中設置的屬性在''viewDidLoad''中爲零。我試圖通過直接設置'_myString'來使用合成存取器,但是沒有用。這真的很難調試,因爲這不是編程錯誤。 – Moritz

回答

-1

是否有任何理由將其設置爲複製?

嘗試將屬性設置爲:

@property (nonatomic, strong) NSString *myString; 
+1

該副本是iOS中的標準做法,下面是來自Big Nerd Ranch的人員的澄清:「一般來說,當您有一個屬性指向具有可變子類的類的實例(如NSString或NSArray)時,將對象的副本指向 比指向可能有其他所有者的現有對象更安全。「 我仍然試圖改變爲強大,沒有根據我所看到的有所作爲。 (順便說一句,我不是一個低調投票) –

0

你確定你是從同一個控制器兩次登錄?喜歡,也許你打電話給一個控制器上的initWithNibName:bundle:,但是viewDidLoad實際上是在另一個控制器上調用的?

相關問題