-[NSWindowController窗口]在用窗口初始化NSWindowController时保留窗口吗?

| 在一个应用程序(OS X 10.6.7)中,我有一个用
-[NSWindowController initWithWindow:]
初始化的ѭ0with子类,即,我已经用代码创建了窗口;我不是从笔尖加载它。 通常,我用
[self window]
引用with0ѭ子类中的窗口。但是在这种情况下,每次我发送
[self window]
时,窗口都会保留下来,所以最终导致大量泄漏。 这是预期的行为吗?目前,我只是通过将窗口存储在
init
方法中的实例变量中而从未发送
[self window]
来解决此问题。 我非常确定这不会发生,因为
NSWindowController
试图加载窗口:
-loadWindow
不保留窗口,
-isWindowLoaded
返回
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
    
已邀请:
        
-[NSWindowController window]
保留窗户就可以了;该问题似乎与自动释放池有关。
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]);
输出为:
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
问题是我在Carbon事件处理程序(
InstallApplicationEventHandler
)中做可可时忘记了创建一个池。这与我链接到的线程的上下文匹配。 通常,当不存在自动释放池时,我会看到一个异常,因此我猜测那里只是一个永不耗尽的池。     

要回复问题请先登录注册