2 Stimmen

-[NSWindowController window] Beibehaltung des Fensters bei Initialisierung von NSWindowController mit window?

In einer Anwendung (OS X 10.6.7) habe ich eine NSWindowController Unterklasse, die initialisiert wird mit -[NSWindowController initWithWindow:] -d.h., ich habe das Fenster bereits im Code erstellt; ich lade es nicht aus einer Nib.

Normalerweise beziehe ich mich auf das Fenster in meinem NSWindowController Unterklassen mit [self window] . Aber in diesem Fall, jedes Mal wenn ich [self window] Das Fenster wird zurückgehalten, so dass ich am Ende ziemlich undicht bin.

Ist dieses Verhalten beabsichtigt? Im Moment habe ich es umgangen, indem ich das Fenster einfach in einer Instanzvariablen in der init Methode und niemals das Senden von [self window] .

Ich bin mir ziemlich sicher, dass dies nicht der Fall ist, weil NSWindowController versucht, das Fenster zu laden: -loadWindow behält das Fenster nicht bei und -isWindowLoaded gibt zurück. YES :

(gdb) set $window = (id)[self window]
Current language:  auto; currently objective-c
(gdb) p (int)[$window retainCount]
$1 = 3
(gdb) p (BOOL)[self isWindowLoaded]
$2 = 1 '\001'
(gdb) call (void)[self loadWindow]
(gdb) p (int)[$window retainCount]
$3 = 3
(gdb) p (int)[[self window] retainCount]
$4 = 4
(gdb) p (int)[[self window] retainCount]
$5 = 5

2voto

Nicholas Riley Punkte 41936

-[NSWindowController window] Das Beibehalten des Fensters ist in Ordnung; das Problem scheint mit den Auto-Release-Pools zusammenzuhängen.

window = [[NSWindow alloc] initWithContentRect:NSMakeRect(100, 100, 200, 200)
                                               styleMask:NSTitledWindowMask
                                                 backing:NSBackingStoreBuffered
                                                   defer:NO];
NSWindowController *controller = [[NSWindowController alloc] initWithWindow:window];
[window setTitle:@"testing"];
[window makeKeyAndOrderFront:nil];
[window release];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[pool drain];
NSLog(@"[window retainCount]: %d", [window retainCount]);

Die Ausgabe ist:

2011-06-12 19:26:52.337 window[5517:a0b] [window retainCount]: 1
2011-06-12 19:26:52.339 window[5517:a0b] [window retainCount]: 4
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 7
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 4

Das Problem war, dass ich vergessen habe, einen Pool zu erstellen, wenn ich Cocoa-Zeug in einem Carbon-Event-Handler mache ( InstallApplicationEventHandler ). Dies entspricht dem Kontext des Threads, auf den ich verwiesen habe.

Normalerweise sehe ich eine Ausnahme, wenn kein automatischer Freigabepool vorhanden ist, also vermute ich, dass es einfach einen Pool gibt, der nie geleert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X