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 に答える