2009-06-01 31 views
0

我有一些在Appdelegate中初始化的類,但是當我在另一個類中得到這個類實例的形式時,它具有「新鮮」狀態。如何正確引用另一個類?

我有以下的AppDelegate中:

接口:

@property (nonatomic, retain) DataController *dataController; 

實現:

@synthesize dataController; 
- (id)init { 
    if (self = [super init]) { 
     DataController *controller = [[DataController alloc] init]; 
     self.dataController = controller; 
     [controller release]; 
     NSLog(@"items: %d",[self.dataController numberOfItems]); 
    } 
    return self; 
} 

此時DataControlelr類負載對象形式的數據庫。日誌輸出顯示「項目:10」。

我有TableViewController我需要使用DataController。

TableViewController頭:

@interface TableViewController : UITableViewController { 
    DataController *dataController; 
} 

@property (retain) DataController *dataController; 
@end 

實現:

-(id)init{ 
    if (self =[super init]) { 
     DataController *dc =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataController]; 
     [dc retain]; 
     dataController = dc; 
     NSLog(@"items: %d",[self.dataController numberOfItems]); 
    } 
    return self; 
} 

這總是說DataController類有0項。 「新鮮」狀態。

日誌輸出始終是

項目10

項目:0

好像是分配類創建參考新鮮初始化DataController類不知何故?

如何正確引用另一個類?

謝謝。

回答

1

檢查是確保在第二類中的dc變量不nil--會導致調用它以「迴歸」 0

任何方法也可能是有用的第一件事從這兩種方法中打印應用程序委託的地址 - 以防萬一-init方法是由某個地方錯誤地分配了該類的第二個實例導致的,而普通版本沒有以相同方式初始化(或正在使用-initWithCoder:等)

對於在nib文件內創建或分配的對象的初始化,一個有用的經驗法則是使用-awakeFromNib執行大部分初始化任務。對此的推論是應用程序委託可以設置其狀態以響應-applicationDidFinishLaunching:方法。在這種情況下,如果有AppDelegate類的第二個實例被分配到某處,那麼只有真的被設置爲應用程序的代理將收到-applicationDidFinishLaunching:

在一天結束時,在調試器中單步調試並查看調用堆棧應該會告訴您是否應該以某種方式發生某些事情。

0

TableViewController中的dataController = dc任務有問題嗎?在您的日誌聲明中,您使用self.dataController,如果您的任務直接在self.dataController = dc之上?

+0

抱歉粘貼錯誤。它是self.datacontroller = dc。 沒有任何區別。 – Rod 2009-06-01 17:29:41

0

我發現了這個問題。坦克對吉姆!

將分配從-init移至-awakefromnib,現在DataController有效。

我的錯誤是,將代碼最初放在-viewDidLoad和-viewWillAppear這是錯誤的,我認爲在-init是分配的地方。

相關問題