2

Xcode ツールを使用して、ガベージ コレクションから ARC にアプリを移植しました。アプリが新しいウィンドウを作成すると、ウィンドウはすぐに消えます。GC の下では、ウィンドウは表示されたままでした。

ARC では、強いポインタを持たないオブジェクトはすべて消えてしまうことを理解しています。NSDocument サブクラス オブジェクトからそれに属するウィンドウへの強力なポインタがありますが、とにかく作成された直後に NSWindow が消えます。

新しい NSDocument サブクラス オブジェクトへの強力なポインタが必要ですか? もしそうなら、そのポインターは何に属していますか?

- (IBAction)importLegacyDocument:(id)sender{
    myDocument* theDocument = [[myDocument alloc]init];

    NSWindowController* theWindowController;
    theWindowController =[[NSWindowController alloc]
                          initWithWindowNibName:@"myDocument" owner: theDocument];
    [theDocument makeWindowControllers];
    [theDocument showWindows];
//WINDOW VANISHES IMMEDIATELY AFTER IT HAS BEEN CREATED
}

情報をお寄せいただきありがとうございます。

4

2 に答える 2

2

はい、ドキュメントへの参照が必要です。メソッド内で作成したオブジェクトは、保持されていなければ破棄されます。NSWindowControllerそのコードのインスタンスにも同じことが言えます。

@property (strong, nonatomic) myDocument *theDocument;
@property (strong, nonatomic) NSWindowController *theWindowController

AppDelegateこれらのプロパティを宣言するのに適した場所です)

次に、作成したインスタンスをプロパティに割り当てます。

self.theDocument = [[myDocument alloc] init];
self.theWindowController = [[NSWindowController alloc] initWithWindowNibName:@"myDocument" owner:self.theDocument];

補足として、Objective-C の規則では、クラスに大文字で名前を付けるため、myDocumentはMyDocumentにする必要があります。

お役に立てれば!

于 2013-07-07T02:39:17.673 に答える
1

はい、その強い参照の正しい場所は nsdocumentcontroller シングルトンです。

alloc/init ではなく、nsdocumentcontroller のメソッドを使用して新しいドキュメントを作成する必要があります。これにより、新しいドキュメントがドキュメント コントローラに自動的に追加され、ドキュメントが閉じられると削除されます。

于 2013-07-07T13:34:38.813 に答える