1

我有一个消失的指针db;该值在创建期间已正确设置,NSDocument但在我想打开一个子窗口时,该值已更改为nil!我在NSDocument子类中有以下内容:

 @interface MW_Document : NSDocument
 {
     MW_WorkerWindowController *workerController;
     __strong MW_db *db;
 }

 - (IBAction)showWorkerManagementPanel:(id)sender;
 //- (IBAction)showSkillManagementPanel:(id)sender;

该实现包含以下内容:

 - (void)windowControllerDidLoadNib:(NSWindowController *)aController
 {
     [super windowControllerDidLoadNib:aController];
     if (![self db]) {
         db = [[MW_db alloc] init];
         NSLog ( @"Debug - Init of db: [%ld]", db ); // never mind the casting problem
     }
 }

db指向的不是 nil,而是一个真实的地址。

稍后,我想打开一个窗口并在同一NSDocument个子类的实现中使用它:

 - (IBAction)showWorkerManagementWindow:(id)sender
 {
     if ( !workerController) {
         workerController = [[MW_WorkerWindowController alloc] initWithDb:db];
     }
     [workerController showWindow:self];
 }

我在第一行放了一个断点,然后查看db的值。它是零,但我知道为什么。谁能给我解释一下?

4

1 回答 1

2

您可以实现一个惰性访问器:

- (MW_db *)db
{
    if (db == nil) {
        db = [[MW_db alloc] init];
    }
    return db;
}

然后用它代替 ivar:

workerController = [[MW_WorkerWindowController alloc] initWithDb:[self db]];
于 2012-06-30T21:42:07.967 回答